diff --git a/task01/src/com/example/task01/Pair.java b/task01/src/com/example/task01/Pair.java index f6fb603b..329afdbd 100644 --- a/task01/src/com/example/task01/Pair.java +++ b/task01/src/com/example/task01/Pair.java @@ -1,5 +1,47 @@ package com.example.task01; -public class Pair { +import java.util.Objects; +import java.util.function.BiConsumer; + +public class Pair < T, U>{ // TODO напишите реализацию + 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; + } + + public static Pair of(T first, U second) { + return new Pair<>(first, second); + } + + public void ifPresent(BiConsumer action) { + if (first != null && second != null) { + action.accept(first, second); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pair pair = (Pair) o; + return Objects.equals(first, pair.first) && + Objects.equals(second, pair.second); + } + + @Override + public int hashCode() { + return Objects.hash(first, second); + } } diff --git a/task01/src/com/example/task01/Task01Main.java b/task01/src/com/example/task01/Task01Main.java index 54dde94f..e4d36b53 100644 --- a/task01/src/com/example/task01/Task01Main.java +++ b/task01/src/com/example/task01/Task01Main.java @@ -8,7 +8,7 @@ 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,7 +21,7 @@ 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..fd94b266 100644 --- a/task02/src/com/example/task02/SavedList.java +++ b/task02/src/com/example/task02/SavedList.java @@ -2,34 +2,65 @@ import java.io.File; import java.io.Serializable; +import java.nio.file.Files; import java.util.AbstractList; +import java.io.*; +import java.util.ArrayList; +import java.util.List; public class SavedList extends AbstractList { + private final File file; + private final List list = new ArrayList<>(); + public SavedList(File file) { + this.file = file; + if (file.exists()) { + try (ObjectInputStream in = new ObjectInputStream(Files.newInputStream(file.toPath()))) { + @SuppressWarnings("unchecked") + List loaded = (List) in.readObject(); + list.addAll(loaded); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Error downloading data from a file", e); + } + } } @Override public E get(int index) { - return null; + return list.get(index); } @Override - public E set(int index, E element) { - return null; + public int size() { + return list.size(); } @Override - public int size() { - return 0; + public E set(int index, E element) { + E old = list.set(index, element); + save(); + return old; } @Override public void add(int index, E element) { + list.add(index, element); + save(); } @Override public E remove(int index) { - return null; + E old = list.remove(index); + save(); + return old; + } + + private void save() { + try (ObjectOutputStream out = new ObjectOutputStream(Files.newOutputStream(file.toPath()))) { + out.writeObject(list); + } catch (IOException e) { + throw new RuntimeException("Error saving data to file", e); + } } } diff --git a/task03/src/com/example/task03/Task03Main.java b/task03/src/com/example/task03/Task03Main.java index 7f255e98..953ac7d0 100644 --- a/task03/src/com/example/task03/Task03Main.java +++ b/task03/src/com/example/task03/Task03Main.java @@ -6,6 +6,9 @@ import java.nio.charset.Charset; import java.util.List; import java.util.Set; +import java.io.*; +import java.util.*; +import java.util.stream.Collectors; public class Task03Main { @@ -19,6 +22,27 @@ public static void main(String[] args) throws IOException { } public static List> findAnagrams(InputStream inputStream, Charset charset) { - return null; + Map> groups = new HashMap<>(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset))) { + reader.lines() + .map(String::trim) + .map(String::toLowerCase) + .filter(word -> word.length() >= 3) + .filter(word -> word.matches("[а-яё]+")) + .forEach(word -> { + char[] chars = word.toCharArray(); + Arrays.sort(chars); + String key = new String(chars); + groups.computeIfAbsent(key, k -> new TreeSet<>()).add(word); + }); + } catch (IOException e) { + return new ArrayList<>(); + } + + return groups.values().stream() + .filter(group -> group.size() >= 2) + .sorted(Comparator.comparing(TreeSet::first)) // сортируем по первому слову + .collect(Collectors.toList()); } + }