Skip to content

Instantly share code, notes, and snippets.

@untainsYD
Created May 22, 2025 06:49
Show Gist options
  • Select an option

  • Save untainsYD/e20db133c558077637c25e738cadfdc9 to your computer and use it in GitHub Desktop.

Select an option

Save untainsYD/e20db133c558077637c25e738cadfdc9 to your computer and use it in GitHub Desktop.
Laboratory 5, Task 2
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