diff --git a/task01/src/com/example/task01/Pair.java b/task01/src/com/example/task01/Pair.java index f6fb603b..bbd756b9 100644 --- a/task01/src/com/example/task01/Pair.java +++ b/task01/src/com/example/task01/Pair.java @@ -1,5 +1,49 @@ package com.example.task01; -public class Pair { - // TODO напишите реализацию +import java.util.Objects; +import java.util.function.BiConsumer; + +public class Pair { + private final T first; + private final U second; + + private Pair(T first, U second) { + this.first = first; + this.second = second; + } + + public T getFirst() { + return first; + } + + public U getSecond() { + return second; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + + Pair pairedObj = (Pair) obj; + return Objects.equals(first, pairedObj.first) && + Objects.equals(second, pairedObj.second); + } + + @Override + public int hashCode() { + return Objects.hash(first, second); + } + + public static Pair of(T first, U second) { + return new Pair<>(first, second); + } + + public void ifPresent(BiConsumer consumer) { + if (first != null && second != null) { + consumer.accept(first, second); + } + } } diff --git a/task01/src/com/example/task01/Task01Main.java b/task01/src/com/example/task01/Task01Main.java index 54dde94f..a5f384fe 100644 --- a/task01/src/com/example/task01/Task01Main.java +++ b/task01/src/com/example/task01/Task01Main.java @@ -8,7 +8,6 @@ public static void main(String[] args) throws IOException { // TODO С корректно реализованным классом Pair должен компилироваться и успешно работать следующий код: - /* Pair pair = Pair.of(1, "hello"); Integer i = pair.getFirst(); // 1 String s = pair.getSecond(); // "hello" @@ -21,8 +20,6 @@ public static void main(String[] args) throws IOException { Pair pair2 = Pair.of(1, "hello"); boolean mustBeTrue = pair.equals(pair2); // true! boolean mustAlsoBeTrue = pair.hashCode() == pair2.hashCode(); // true! - */ - } } diff --git a/task02/src/com/example/task02/SavedList.java b/task02/src/com/example/task02/SavedList.java index 6b3a037d..b42c4de7 100644 --- a/task02/src/com/example/task02/SavedList.java +++ b/task02/src/com/example/task02/SavedList.java @@ -3,33 +3,70 @@ import java.io.File; import java.io.Serializable; import java.util.AbstractList; +import java.io.*; +import java.util.ArrayList; +import java.util.List; -public class SavedList extends AbstractList { +public class SavedList extends AbstractList { + private final File file; + private final List list; public SavedList(File file) { + this.file = file; + this.list = new ArrayList<>(); + + if (file.exists() && file.length() > 0) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) { + List loadedList = (List) ois.readObject(); + list.addAll(loadedList); + } catch (IOException | ClassNotFoundException e) { + System.err.println("Ошибка загрузки: " + e.getMessage()); + } + } + } + + private void saveToFile() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) { + oos.writeObject(new ArrayList<>(list)); + } catch (IOException e) { + System.err.println("Ошибка сохранения: " + e.getMessage()); + } } @Override - public E get(int index) { - return null; + public T get(int index) { + return list.get(index); } @Override - public E set(int index, E element) { - return null; + public T set(int index, T element) { + T oldElement = list.set(index, element); + saveToFile(); + return oldElement; } @Override public int size() { - return 0; + return list.size(); + } + + @Override + public void add(int index, T element) { + list.add(index, element); + saveToFile(); } @Override - public void add(int index, E element) { + public boolean add(T element) { + boolean result = list.add(element); + saveToFile(); + return result; } @Override - public E remove(int index) { - return null; + public T remove(int index) { + T removedElement = list.remove(index); + saveToFile(); + return removedElement; } } diff --git a/task03/src/com/example/task03/Task03Main.java b/task03/src/com/example/task03/Task03Main.java index 7f255e98..5d4b6d99 100644 --- a/task03/src/com/example/task03/Task03Main.java +++ b/task03/src/com/example/task03/Task03Main.java @@ -1,11 +1,11 @@ package com.example.task03; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.nio.charset.Charset; +import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.*; public class Task03Main { @@ -19,6 +19,49 @@ public static void main(String[] args) throws IOException { } public static List> findAnagrams(InputStream inputStream, Charset charset) { - return null; + Map> anagramMap = new HashMap<>(); + + readAndProcessWords(inputStream, charset, anagramMap); + + return createSortedResult(anagramMap); + } + + private static void readAndProcessWords(InputStream inputStream, Charset charset, + Map> anagramMap) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset))) { + reader.lines() + .map(String::trim) + .map(String::toLowerCase) + .filter(word -> word.length() >= 3) + .filter(Task03Main::isValidRussianWord) + .forEach(word -> { + String key = getSortedLetters(word); + anagramMap.computeIfAbsent(key, k -> new TreeSet<>()).add(word); + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static List> createSortedResult(Map> anagramMap) { + return anagramMap.values().stream() + .filter(group -> group.size() >= 2) + .sorted(Comparator.comparing(group -> group.iterator().next())) + .collect(ArrayList::new, ArrayList::add, ArrayList::addAll); + } + + private static boolean isValidRussianWord(String word) { + return word.chars().allMatch(Task03Main::isRussianLetter); + } + + private static boolean isRussianLetter(int codePoint) { + char c = (char) codePoint; + return (c >= 'а' && c <= 'я') || c == 'ё'; + } + + private static String getSortedLetters(String word) { + char[] letters = word.toCharArray(); + Arrays.sort(letters); + return new String(letters); } }