Created
May 22, 2025 06:49
-
-
Save untainsYD/e20db133c558077637c25e738cadfdc9 to your computer and use it in GitHub Desktop.
Laboratory 5, Task 2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package lab5.sorting; | |
| import java.io.*; | |
| import java.util.*; | |
| /** | |
| * Клас для читання цілих чисел з файлу, сортування за сумою цифр та збереження результатів. | |
| */ | |
| public class IntegerSorter { | |
| /** | |
| * Читає цілі числа з текстового файлу, сортує за сумою цифр та зберігає результати | |
| * @param inputFileName ім'я вхідного файлу з числами | |
| * @param ascendingFileName ім'я файлу для збереження чисел, відсортованих за збільшенням суми цифр | |
| * @param descendingFileName ім'я файлу для збереження чисел, відсортованих за зменшенням суми цифр | |
| * @throws IOException у разі помилки читання/запису файлів | |
| */ | |
| public static void sortIntegersByDigitSum(String inputFileName, String ascendingFileName, String descendingFileName) throws IOException { | |
| // Читання чисел з файлу | |
| List<Integer> numbers = readNumbersFromFile(inputFileName); | |
| if (numbers.isEmpty()) { | |
| throw new IOException("Файл порожній або не містить валідних цілих чисел"); | |
| } | |
| System.out.println("Прочитано " + numbers.size() + " чисел з файлу: " + inputFileName); | |
| System.out.println("Числа: " + numbers); | |
| // Виведення сум цифр для кожного числа | |
| System.out.println("\nСуми цифр:"); | |
| for (Integer number : numbers) { | |
| int digitSum = DigitSumComparator.calculateDigitSum(number); | |
| System.out.println(" " + number + " -> сума цифр: " + digitSum); | |
| } | |
| // Сортування за збільшенням суми цифр | |
| List<Integer> ascendingSorted = new ArrayList<>(numbers); | |
| ascendingSorted.sort(new DigitSumComparator()); | |
| // Сортування за зменшенням суми цифр | |
| List<Integer> descendingSorted = new ArrayList<>(numbers); | |
| descendingSorted.sort(new DigitSumComparatorDescending()); | |
| // Запис результатів у файли | |
| writeNumbersToFile(ascendingSorted, ascendingFileName); | |
| writeNumbersToFile(descendingSorted, descendingFileName); | |
| // Виведення результатів у консоль | |
| System.out.println("\nРезультати сортування:"); | |
| System.out.println("За збільшенням суми цифр: " + ascendingSorted); | |
| System.out.println("За зменшенням суми цифр: " + descendingSorted); | |
| System.out.println("\nРезультати збережено у файли:"); | |
| System.out.println(" " + ascendingFileName); | |
| System.out.println(" " + descendingFileName); | |
| } | |
| /** | |
| * Читає цілі числа з текстового файлу | |
| * @param fileName ім'я файлу для читання | |
| * @return список прочитаних чисел | |
| * @throws IOException у разі помилки читання файлу | |
| */ | |
| private static List<Integer> readNumbersFromFile(String fileName) throws IOException { | |
| List<Integer> numbers = new ArrayList<>(); | |
| try (Scanner scanner = new Scanner(new FileReader(fileName))) { | |
| while (scanner.hasNext()) { | |
| if (scanner.hasNextInt()) { | |
| int number = scanner.nextInt(); | |
| if (number > 0) { // Читаємо тільки додатні числа згідно з завданням | |
| numbers.add(number); | |
| } | |
| } else { | |
| // Пропускаємо нечислові значення | |
| scanner.next(); | |
| } | |
| } | |
| } | |
| return numbers; | |
| } | |
| /** | |
| * Записує список чисел у текстовий файл | |
| * @param numbers список чисел для запису | |
| * @param fileName ім'я файлу для запису | |
| * @throws IOException у разі помилки запису файлу | |
| */ | |
| private static void writeNumbersToFile(List<Integer> numbers, String fileName) throws IOException { | |
| try (PrintWriter writer = new PrintWriter(new FileWriter(fileName))) { | |
| for (int i = 0; i < numbers.size(); i++) { | |
| writer.print(numbers.get(i)); | |
| if (i < numbers.size() - 1) { | |
| writer.print(" "); | |
| } | |
| } | |
| writer.println(); // Додаємо новий рядок в кінці | |
| } | |
| } | |
| /** | |
| * Створює тестовий файл з числами для демонстрації | |
| * @param fileName ім'я файлу для створення | |
| * @throws IOException у разі помилки створення файлу | |
| */ | |
| public static void createTestFile(String fileName) throws IOException { | |
| try (PrintWriter writer = new PrintWriter(new FileWriter(fileName))) { | |
| // Створюємо тестові числа з різними сумами цифр | |
| int[] testNumbers = {123, 45, 678, 9, 111, 222, 13, 31, 100, 999, 456, 789, 12, 21}; | |
| for (int i = 0; i < testNumbers.length; i++) { | |
| writer.print(testNumbers[i]); | |
| if (i < testNumbers.length - 1) { | |
| writer.print(" "); | |
| } | |
| } | |
| writer.println(); | |
| } | |
| System.out.println("Створено тестовий файл: " + fileName); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment