Загрузка данных
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;
public class Main {
// Чтение всех художников из файла
public static Painter[] readPainters(String fileName)
throws IOException {
List<String> lines = Files.readAllLines(
Paths.get(fileName), StandardCharsets.UTF_8);
List<String> data = new ArrayList<>();
// Убираем пустые строки между записями
for (String line : lines) {
if (!line.trim().isEmpty()) {
data.add(line.trim());
}
}
if (data.size() % 6 != 0) {
throw new IOException(
"Ошибка: количество строк не делится на 6. Проверь painters.txt.");
}
List<Painter> list = new ArrayList<>();
for (int i = 0; i < data.size(); i += 6) {
String name = data.get(i);
String years = data.get(i + 1);
String styles = data.get(i + 2);
String country = data.get(i + 3);
String wiki = data.get(i + 4);
String paintingsText = data.get(i + 5);
try {
int paintings = Integer.parseInt(paintingsText);
if (paintings < 0) {
throw new NumberFormatException();
}
Painter p = new Painter(
name, years, styles, country, wiki, paintings);
list.add(p);
} catch (NumberFormatException e) {
throw new IOException(
"Ошибка в количестве картин у художника: " + name);
}
}
return list.toArray(new Painter[0]);
}
// Поиск художника по имени
public static Painter findPainter(Painter[] painters, String name) {
for (Painter p : painters) {
if (p.getName().equalsIgnoreCase(name.trim())) {
return p;
}
}
return null;
}
// Проверка, является ли художник русским
public static boolean isRussian(Painter p) {
String country = p.getCountry().toLowerCase(Locale.ROOT);
return country.contains("росси")
|| country.contains("russia")
|| country.contains("русск");
}
// Задание 3. Поиск земляков
public static Painter[] findCompatriots(
Painter[] painters, String name) {
Painter target = findPainter(painters, name);
if (target == null) {
return new Painter[0];
}
List<Painter> result = new ArrayList<>();
for (Painter p : painters) {
if (p != target
&& p.getCountry().equalsIgnoreCase(
target.getCountry())) {
result.add(p);
}
}
return result.toArray(new Painter[0]);
}
// Задание 4. Поиск художников, живших в заданном году
public static void printPaintersInYear(
Painter[] painters, int year) {
boolean found = false;
for (Painter p : painters) {
String[] parts = p.getYears().split("-");
if (parts.length != 2) {
continue;
}
try {
int birth = Integer.parseInt(parts[0].trim());
int death = Integer.parseInt(parts[1].trim());
if (birth > 0 && death >= birth
&& year >= birth && year <= death) {
System.out.println(p.getWiki());
found = true;
}
} catch (NumberFormatException e) {
System.out.println(
"Ошибка в годах жизни: " + p.getName());
}
}
if (!found) {
System.out.println(
"Художники, жившие в этом году, не найдены.");
}
}
// Задание 5. Поиск художников, проживших большую часть жизни в веке
public static void printPaintersInCentury(
Painter[] painters, int century) {
int start = (century - 1) * 100 + 1;
int end = century * 100;
boolean found = false;
for (Painter p : painters) {
String[] parts = p.getYears().split("-");
if (parts.length != 2) {
continue;
}
try {
int birth = Integer.parseInt(parts[0].trim());
int death = Integer.parseInt(parts[1].trim());
if (birth <= 0 || death < birth) {
continue;
}
int totalYears = death - birth + 1;
int from = Math.max(birth, start);
int to = Math.min(death, end);
int yearsInCentury = Math.max(0, to - from + 1);
if (yearsInCentury > totalYears / 2.0) {
System.out.println(p.getStory());
System.out.println();
found = true;
}
} catch (NumberFormatException e) {
System.out.println(
"Ошибка в годах жизни: " + p.getName());
}
}
if (!found) {
System.out.println(
"Подходящие художники не найдены.");
}
}
// Задание 6. Группировка художников по стилям
public static Map<String, Painter[]> groupByStyle(
Painter[] painters) {
Set<String> allStyles = new TreeSet<>(
String.CASE_INSENSITIVE_ORDER);
for (Painter p : painters) {
String[] styles = p.getStyles().split(",");
for (String style : styles) {
if (!style.trim().isEmpty()) {
allStyles.add(style.trim());
}
}
}
Map<String, Painter[]> result = new LinkedHashMap<>();
for (String style : allStyles) {
List<Painter> group = new ArrayList<>();
for (Painter p : painters) {
String[] styles = p.getStyles().split(",");
for (String s : styles) {
if (s.trim().equalsIgnoreCase(style)) {
group.add(p);
break;
}
}
}
result.put(style, group.toArray(new Painter[0]));
}
return result;
}
public static void main(String[] args) {
try {
// Читаем весь файл
Painter[] painters = readPainters("painters.txt");
if (painters.length == 0) {
System.out.println("Файл не содержит художников.");
return;
}
System.out.println(
"Загружено художников: " + painters.length);
// Задание 1. Создаём ссылки на первые три объекта
if (painters.length < 3) {
System.out.println(
"Ошибка: в файле должно быть не менее трёх художников.");
return;
}
Painter p1 = painters[0];
Painter p2 = painters[1];
Painter p3 = painters[2];
System.out.println("\nПервые три художника:");
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
System.out.println("\nРусские художники из файла:");
boolean russianFound = false;
for (Painter p : painters) {
if (isRussian(p)) {
System.out.println(p);
russianFound = true;
}
}
if (!russianFound) {
System.out.println("Русские художники не найдены.");
}
// Демонстрация методов класса
System.out.println("\nПример рассказа:");
System.out.println(p1.getStory());
int lived = p1.getLivedYears();
if (lived >= 0) {
System.out.println(
"Прожил лет: " + lived);
} else {
System.out.println(
"Не удалось определить годы жизни.");
}
System.out.println(
"У первых двух художников общий стиль: "
+ p1.hasSameStyle(p2));
// Задание 3. Поиск земляков
Scanner sc = new Scanner(System.in);
System.out.print(
"\nЗадание 3. Введите имя художника: ");
String name = sc.nextLine();
Painter target = findPainter(painters, name);
if (target == null) {
System.out.println(
"Ошибка: художник не найден.");
} else {
Painter[] compatriots =
findCompatriots(painters, name);
if (compatriots.length == 0) {
System.out.println(
"Земляки не найдены.");
} else {
System.out.println(
"Земляки из страны "
+ target.getCountry() + ":");
for (Painter p : compatriots) {
System.out.println(p);
}
}
}
// Задание 4. Поиск по году
System.out.print(
"\nЗадание 4. Введите год: ");
try {
int year = Integer.parseInt(sc.nextLine().trim());
if (year <= 0) {
System.out.println(
"Ошибка: год должен быть положительным.");
} else {
printPaintersInYear(painters, year);
}
} catch (NumberFormatException e) {
System.out.println(
"Ошибка: нужно ввести целое число.");
}
// Задание 5. Поиск по веку
System.out.print(
"\nЗадание 5. Введите номер века: ");
try {
int century =
Integer.parseInt(sc.nextLine().trim());
if (century <= 0 || century > 21474836) {
System.out.println(
"Ошибка: некорректный номер века.");
} else {
printPaintersInCentury(painters, century);
}
} catch (NumberFormatException e) {
System.out.println(
"Ошибка: нужно ввести целое число.");
}
// Задание 6. Вывод групп по стилям
Map<String, Painter[]> groups =
groupByStyle(painters);
System.out.println("\nЗадание 6. Художники по стилям:");
for (Map.Entry<String, Painter[]> entry
: groups.entrySet()) {
System.out.println(
"\nСтиль: " + entry.getKey());
for (Painter p : entry.getValue()) {
System.out.println(p.getName());
}
}
sc.close();
} catch (IOException e) {
System.out.println(
"Ошибка чтения файла: " + e.getMessage());
}
}
}