import java.io.*; import java.util.LinkedHashSet; import java.util.Scanner; import java.util.HashSet; public class Main { private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) { HashSet[] sets, resultSets; outputTask(); sets = choiceOfInput(); resultSets = calculateSet(sets); outputAnswer(resultSets); } public static void outputTask() { System.out.println("Данная программа формирует множество Y={X1 * X2* X3} и выделяет из него подмножество Y1, которое представляет все цифры,входящие в Y. Например, дано X1={‘s’, ‘v’, ‘e’, ‘t’, ‘a’,’ ‘2’}; X2={‘*’, ’-‘, ‘*’, ‘-‘}; X3={‘1’, ‘4’, ‘7’, ‘a’, ‘b’, ‘c’}."); } public static HashSet[] choiceOfInput() { int choice; boolean isNotCorrect; HashSet[] sets; choice = -1; do { isNotCorrect = false; System.out.println("Выберите, откуда вводить данные. Введите 0, если с консоли; 1, если с файла"); try { choice = Integer.parseInt(scanner.nextLine()); } catch (NumberFormatException exception) { isNotCorrect = true; } if (isNotCorrect || ((choice != 0) && (choice != 1))) { isNotCorrect = true; System.err.println("Неверный ввод данных!"); } } while (isNotCorrect); if (choice == 0) { sets = inputFromConsole(); } else { sets = inputFromFile(); } return sets; } public static String getExtension(String path) { int pos = path.lastIndexOf('.'); if (pos <= 0) { return ""; } return path.substring(pos + 1); } public static String choicePath() { String path; boolean isIncorrect; do { isIncorrect = false; System.out.println("Введите путь к файлу: "); path = scanner.nextLine(); File file = new File(path); if (!file.exists()) { System.out.println("По указанном пути файл не найден."); isIncorrect = true; } else if (!getExtension(path).equals("txt")) { System.err.println("Ошибка, неправильный тип файла!"); isIncorrect = true; } } while (isIncorrect); return path; } public static HashSet[] inputFromFile() { String path; String stringOfElements; HashSet charSet; HashSet[] sets; sets = new HashSet[3]; System.out.println("При вводе из файла учтите, что в файле элементы множества должны быть записаны в строку без пробелов."); path = choicePath(); for(int i = 0; i < 3; i++) { stringOfElements = inputStringFromFile(path, i); charSet = convertToSet(stringOfElements, i); sets[i] = charSet; } return sets; } public static String inputStringFromFile(String path, int num) { boolean isNotCorrect; String str; str = ""; isNotCorrect = false; System.out.println("Считывание элементов множества" + (num+1) + "..."); try (BufferedReader reader = new BufferedReader(new FileReader(path))) { for(int i = 0; i < num; i++) { str = reader.readLine(); } str = reader.readLine(); } catch (IOException ioException) { isNotCorrect = true; } for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' ' && !isNotCorrect) { isNotCorrect = true; } } if (str.isEmpty() || isNotCorrect) { System.out.println("Ошибка ввода! Множество должно иметь минимум 1 символ и не должно иметь пробелы! Введите элементы множества " + (num+1) + " с клавиатуры."); str = inputStringFromConsole(num); } return str; } public static String inputStringFromConsole(int num) { String str; boolean isNotCorrect; do { isNotCorrect = false; System.out.println("Введите элементы множества " + (num + 1) + " в строку без пробелов: "); str = scanner.nextLine(); for (int i = 0; i < str.length(); i++) { if ((str.charAt(i) == ' ') && !isNotCorrect) { isNotCorrect = true; } } if (str.isEmpty() || isNotCorrect) { System.out.println("Ошибка ввода! Множество должно иметь хотя бы 1 элемент и не иметь пробелы! Повторите попытку."); isNotCorrect = true; } } while(isNotCorrect); return str; } public static HashSet convertToSet(String str, int num) { HashSet charSet = new HashSet<>(); for (char elem : str.toCharArray()) { charSet.add(elem); } outputSet(charSet, num); return charSet; } public static void outputSet(HashSet charSet, int num) { System.out.println("Полученное множество " + (num + 1) + ": "); for (char elem : charSet) { System.out.print(elem + " "); } System.out.println(); } public static HashSet[] inputFromConsole() { HashSet charSet; String str; HashSet[] sets; sets = new HashSet[3]; for (int i = 0; i < 3; i++) { str = inputStringFromConsole(i); charSet = convertToSet(str, i); sets[i] = charSet; } return sets; } public static HashSet[] calculateSet(HashSet[] sets) { HashSet symbolsSet = new HashSet<>(); HashSet[] resultSets; resultSets = new HashSet[2]; resultSets[0] = new HashSet(); resultSets[1] = new HashSet(); for (char c = '0'; c <= '9'; c++) { symbolsSet.add(c); } resultSets[0] = sets[0]; resultSets[0].retainAll(sets[1]); resultSets[0].retainAll(sets[2]); resultSets[1] = symbolsSet; resultSets[1].retainAll(resultSets[0]); return resultSets; } public static void outputAnswer(HashSet[] sets) { String path; boolean isIncorrect; System.out.println("Множество Y = X1 * X2 + X3 = "); for(char elem : sets[0]) { System.out.print(elem + " "); } if (sets[1].size() == 0) { System.out.println("\nЦифры не были встречены в подмножестве Y1! "); } else { System.out.println("\nЦифры в множестве Y1:"); for (char elem : sets[1]) { System.out.print(elem + " "); } System.out.println(); } path = outputPath(); do { isIncorrect = false; try (FileWriter writer = new FileWriter(path, true)) { writer.write("Множество Y = X1 * X2 + X3 = "); for(char elem : sets[0]) { writer.write(elem + " "); } if (sets[1].size() == 0) { writer.write("\nЦифры не были встречены в подмножестве Y1! "); } else { writer.write("\nЦифры в множестве Y1:"); for (char elem : sets[1]) { writer.write(elem + " "); } } } catch (IOException ioException) { System.err.println("Ошибка при записи в файл"); isIncorrect = true; } } while (isIncorrect); System.out.println("Данные записаны в файл."); } public static String outputPath() { String path; boolean isIncorrect; do { isIncorrect = false; System.out.println("Введите путь к файлу для вывода: "); System.out.println(); path = scanner.nextLine(); File file = new File(path); if (!file.exists()) { System.out.println("По указанном пути файл не найден."); isIncorrect = true; } else if (!getExtension(path).equals("txt")) { System.err.println("Ошибка, неправильный тип файла!"); isIncorrect = true; } } while (isIncorrect); return path; } }