Загрузка данных



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());
        }
    }
}