diff --git a/task01/src/com/example/task01/Task01Main.java b/task01/src/com/example/task01/Task01Main.java index de4599c1..3929d271 100644 --- a/task01/src/com/example/task01/Task01Main.java +++ b/task01/src/com/example/task01/Task01Main.java @@ -23,7 +23,11 @@ public static Function ternaryOperator( Function ifTrue, Function ifFalse) { - return null; // your implementation here + // Проверка на null аргументы + if (condition == null || ifTrue == null || ifFalse == null) { + throw new NullPointerException("All arguments must be non-null"); + } + return t -> condition.test(t) ? ifTrue.apply(t) : ifFalse.apply(t); } } diff --git a/task02/src/com/example/task02/Task02Main.java b/task02/src/com/example/task02/Task02Main.java index 309260d8..fc6ba899 100644 --- a/task02/src/com/example/task02/Task02Main.java +++ b/task02/src/com/example/task02/Task02Main.java @@ -5,19 +5,33 @@ public class Task02Main { public static void main(String[] args) { - /* cycleGrayCode(2) .limit(10) .forEach(System.out::println); */ - } public static IntStream cycleGrayCode(int n) { - - return null; // your implementation here - + // Проверка корректности входного параметра + if (n < 1 || n > 16) { + throw new IllegalArgumentException("n must be between 1 and 16"); + } + + // Вычисляем количество кодов Грея для n бит + int totalCodes = 1 << n; // 2^n + + // Создаем массив для хранения всех кодов Грея + int[] grayCodes = new int[totalCodes]; + + // Заполняем массив кодами Грея + for (int i = 0; i < totalCodes; i++) { + // Формула преобразования двоичного числа в код Грея + grayCodes[i] = i ^ (i >> 1); + } + + // Создаем бесконечный циклический поток + return IntStream.iterate(0, i -> (i + 1) % totalCodes) + .map(i -> grayCodes[i]); } - -} +} \ No newline at end of file diff --git a/task03/src/com/example/task03/Task03Main.java b/task03/src/com/example/task03/Task03Main.java index 254d5cb0..f53a32c5 100644 --- a/task03/src/com/example/task03/Task03Main.java +++ b/task03/src/com/example/task03/Task03Main.java @@ -7,14 +7,11 @@ public class Task03Main { public static void main(String[] args) { - findMinMax( Stream.of(2, 9, 5, 4, 8, 1, 3), Integer::compareTo, - (min, max) -> - System.out.println("min: " + min + " / max: " + max) + (min, max) -> System.out.println("min: " + min + " / max: " + max) ); - } public static void findMinMax( @@ -22,6 +19,67 @@ public static void findMinMax( Comparator order, BiConsumer minMaxConsumer) { - // your implementation here + // Проверка на null аргументы + if (stream == null || order == null || minMaxConsumer == null) { + throw new NullPointerException("All arguments must be non-null"); + } + + // Внутренний класс для хранения пары min/max + class MinMaxHolder { + T min; + T max; + boolean hasElements = false; + + // Метод для обновления min/max при обработке нового элемента + void update(T element) { + if (!hasElements) { + // Первый элемент - инициализируем и min и max + min = element; + max = element; + hasElements = true; + } else { + // Сравниваем с текущим min и max + if (order.compare(element, min) < 0) { + min = element; + } + if (order.compare(element, max) > 0) { + max = element; + } + } + } + + // Метод для объединения двух холдеров (полезно для параллельных потоков) + MinMaxHolder combine(MinMaxHolder other) { + if (!other.hasElements) { + return this; + } + if (!this.hasElements) { + return other; + } + + MinMaxHolder result = new MinMaxHolder(); + result.hasElements = true; + result.min = order.compare(this.min, other.min) <= 0 ? this.min : other.min; + result.max = order.compare(this.max, other.max) >= 0 ? this.max : other.max; + return result; + } + } + + // Обрабатываем поток и собираем результаты + MinMaxHolder result = stream.reduce( + new MinMaxHolder(), // Начальное значение + (holder, element) -> { + holder.update(element); + return holder; + }, + MinMaxHolder::combine // Комбинатор для параллельных потоков + ); + + // Вызываем consumer с результатами + if (result.hasElements) { + minMaxConsumer.accept(result.min, result.max); + } else { + minMaxConsumer.accept(null, null); + } } -} +} \ No newline at end of file diff --git a/task04/src/com/example/task04/Task04Main.java b/task04/src/com/example/task04/Task04Main.java index 1e38e6eb..4d9db83e 100644 --- a/task04/src/com/example/task04/Task04Main.java +++ b/task04/src/com/example/task04/Task04Main.java @@ -1,11 +1,34 @@ package com.example.task04; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + public class Task04Main { public static void main(String[] args) { - - // your implementation here - + // Читаем из System.in, обязательно указывая кодировку UTF-8 + new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)) + .lines() // Превращаем текст в поток строк + // Разбиваем каждую строку на слова по разделителю (все, что не буквы и не цифры) + .flatMap(line -> Arrays.stream(line.split("[^\\p{L}\\p{N}]+"))) + // Убираем пустые строки, которые могут возникнуть из-за split (например, если строка начинается с пробела) + .filter(word -> !word.isEmpty()) + // Переводим в нижний регистр + .map(String::toLowerCase) + // Собираем в Map, где ключ - слово, значение - количество + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) + .entrySet().stream() // Превращаем карту обратно в стрим пар (Слово=Количество) + // Сортируем: сначала по количеству (убывание), затем по слову (алфавитный порядок) + .sorted(Map.Entry.comparingByValue().reversed() + .thenComparing(Map.Entry.comparingByKey())) + .limit(10) // Берем только топ-10 + .forEach(entry -> System.out.print(entry.getKey() + '\n')); // Выводим слова } -} +} \ No newline at end of file diff --git a/task05/src/com/example/task05/MailContent.java b/task05/src/com/example/task05/MailContent.java new file mode 100644 index 00000000..db7a0694 --- /dev/null +++ b/task05/src/com/example/task05/MailContent.java @@ -0,0 +1,8 @@ +// MailContent.java +package com.example.task05; + +public interface MailContent { + String getFrom(); + String getTo(); + T getContent(); +} \ No newline at end of file diff --git a/task05/src/com/example/task05/MailMessage.java b/task05/src/com/example/task05/MailMessage.java new file mode 100644 index 00000000..f00ec5cd --- /dev/null +++ b/task05/src/com/example/task05/MailMessage.java @@ -0,0 +1,29 @@ +// MailMessage.java +package com.example.task05; + +public class MailMessage implements MailContent { + private final String from; + private final String to; + private final String content; + + public MailMessage(String from, String to, String content) { + this.from = from; + this.to = to; + this.content = content; + } + + @Override + public String getFrom() { + return from; + } + + @Override + public String getTo() { + return to; + } + + @Override + public String getContent() { + return content; + } +} \ No newline at end of file diff --git a/task05/src/com/example/task05/MailService.java b/task05/src/com/example/task05/MailService.java new file mode 100644 index 00000000..0f3614ee --- /dev/null +++ b/task05/src/com/example/task05/MailService.java @@ -0,0 +1,33 @@ +// MailService.java +package com.example.task05; + +import java.util.*; +import java.util.function.Consumer; + +public class MailService implements Consumer> { + private final Map> mailBox = new HashMap<>(); + + @Override + public void accept(MailContent mailContent) { + String to = mailContent.getTo(); + T content = mailContent.getContent(); + + mailBox.computeIfAbsent(to, k -> new ArrayList<>()).add(content); + } + + public Map> getMailBox() { + // Возвращаем "безопасную" версию Map, которая для отсутствующих ключей возвращает пустой список + return new AbstractMap>() { + @Override + public Set>> entrySet() { + return mailBox.entrySet(); + } + + @Override + public List get(Object key) { + List result = mailBox.get(key); + return result != null ? result : Collections.emptyList(); + } + }; + } +} \ No newline at end of file diff --git a/task05/src/com/example/task05/Salary.java b/task05/src/com/example/task05/Salary.java new file mode 100644 index 00000000..8cb2a16a --- /dev/null +++ b/task05/src/com/example/task05/Salary.java @@ -0,0 +1,29 @@ +// Salary.java +package com.example.task05; + +public class Salary implements MailContent { + private final String from; + private final String to; + private final int salary; + + public Salary(String from, String to, int salary) { + this.from = from; + this.to = to; + this.salary = salary; + } + + @Override + public String getFrom() { + return from; + } + + @Override + public String getTo() { + return to; + } + + @Override + public Integer getContent() { + return salary; + } +} \ No newline at end of file diff --git a/task05/src/com/example/task05/Task05Main.java b/task05/src/com/example/task05/Task05Main.java index ae31f6bc..68696f56 100644 --- a/task05/src/com/example/task05/Task05Main.java +++ b/task05/src/com/example/task05/Task05Main.java @@ -9,7 +9,6 @@ public class Task05Main { public static void main(String[] args) { - /* // Random variables String randomFrom = "..."; // Некоторая случайная строка. Можете выбрать ее самостоятельно. @@ -88,7 +87,6 @@ public static void main(String[] args) { assert salaries.get(randomTo).equals(Arrays.asList(randomSalary)) : "wrong salaries mailbox content (3)"; - */ }