From a59d574c67fea20aea6847e7d5cf3e93c817a72e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BE=D0=BB=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=93=D0=B5?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D0=BD?= Date: Mon, 31 Aug 2026 17:58:15 +0400 Subject: [PATCH] refactor: reorganize collection utilities and search imports --- .../ru/project/collectors/MyCollectors.java | 17 +- .../project/collectors/MyListCollector.java | 58 +++-- .../finder/StudentOccurrenceIndexFinder.java | 211 +++++++++--------- .../project/search/StudentSearchService.java | 42 ++-- 4 files changed, 165 insertions(+), 163 deletions(-) diff --git a/app/src/main/java/ru/project/collectors/MyCollectors.java b/app/src/main/java/ru/project/collectors/MyCollectors.java index d0d7cf5..83b7ae8 100644 --- a/app/src/main/java/ru/project/collectors/MyCollectors.java +++ b/app/src/main/java/ru/project/collectors/MyCollectors.java @@ -1,15 +1,12 @@ package ru.project.collectors; + import java.util.stream.Collector; +import ru.project.collection.MyList; -public class MyCollectors -{ - private MyCollectors() { +public class MyCollectors { + private MyCollectors() {} - } - - public static Collector, MyList> toMyList() - { - return new MyListCollector<>(); - - } + public static Collector, MyList> toMyList() { + return new MyListCollector<>(); + } } diff --git a/app/src/main/java/ru/project/collectors/MyListCollector.java b/app/src/main/java/ru/project/collectors/MyListCollector.java index bb168e4..c5958b0 100644 --- a/app/src/main/java/ru/project/collectors/MyListCollector.java +++ b/app/src/main/java/ru/project/collectors/MyListCollector.java @@ -1,43 +1,41 @@ package ru.project.collectors; -import java.util.Collections; + import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; -public class MyListCollector implements Collector, MyList> -{ - @Override - public Supplier> supplier() - { - return () -> new MyLinkedList<>(); - } +import ru.project.collection.MyLinkedList; +import ru.project.collection.MyList; - @Override - public BiConsumer, T> accumulator() { +public class MyListCollector implements Collector, MyList> { + @Override + public Supplier> supplier() { + return () -> new MyLinkedList<>(); + } - return (list, element) -> list.add(element); - } + @Override + public BiConsumer, T> accumulator() { - @Override - public BinaryOperator> combiner() { - return (list1, list2) -> { - list1.addAll(list2); - return list1; - }; - } + return (list, element) -> list.add(element); + } - @Override - public Function, MyList> finisher() - { - return list -> list; - } + @Override + public BinaryOperator> combiner() { + return (list1, list2) -> { + list1.addAll(list2); + return list1; + }; + } - @Override - public Set characteristics() { - return java.util.Set.of( - Collector.Characteristics.IDENTITY_FINISH - ); - } + @Override + public Function, MyList> finisher() { + return list -> list; + } + + @Override + public Set characteristics() { + return java.util.Set.of(Collector.Characteristics.IDENTITY_FINISH); + } } diff --git a/app/src/main/java/ru/project/finder/StudentOccurrenceIndexFinder.java b/app/src/main/java/ru/project/finder/StudentOccurrenceIndexFinder.java index 7e7c3d2..45ac263 100644 --- a/app/src/main/java/ru/project/finder/StudentOccurrenceIndexFinder.java +++ b/app/src/main/java/ru/project/finder/StudentOccurrenceIndexFinder.java @@ -1,125 +1,132 @@ package ru.project.finder; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -public class StudentOccurrenceIndexFinder -{ - public int[] findOccurrences(MyList students, Student target) { - if (students == null) { - throw new IllegalArgumentException(); - } - if (target == null) { - throw new IllegalArgumentException(); - } - if (students.isEmpty()) { - return new int[0]; - } - int size = students.size(); - int threadCount = calculateThreadCount(size); - int chunkSize = countChunkSize(size, threadCount); +import ru.project.collection.MyLinkedList; +import ru.project.collection.MyList; +import ru.project.student.Student; - ExecutorService executor = Executors.newFixedThreadPool(threadCount); - MyList>> futures = new MyLinkedList<>(); +public class StudentOccurrenceIndexFinder { + public int[] findOccurrences(MyList students, Student target) { + if (students == null) { + throw new IllegalArgumentException(); + } + if (target == null) { + throw new IllegalArgumentException(); + } + if (students.isEmpty()) { + return new int[0]; + } + int size = students.size(); + int threadCount = calculateThreadCount(size); + int chunkSize = countChunkSize(size, threadCount); - for (int i = 0; i < threadCount; i++) { - int fromIndex = i * chunkSize; - int toIndex = Math.min(fromIndex + chunkSize, size); + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + MyList>> futures = new MyLinkedList<>(); - if (fromIndex >= toIndex) { - break; - } + for (int i = 0; i < threadCount; i++) { + int fromIndex = i * chunkSize; + int toIndex = Math.min(fromIndex + chunkSize, size); - final int start = fromIndex; - final int end = toIndex; + if (fromIndex >= toIndex) { + break; + } - Future> future = executor.submit(() -> { + final int start = fromIndex; + final int end = toIndex; + + Future> future = + executor.submit( + () -> { return findInRange(students, target, start, end); - }); - futures.add(future); + }); + futures.add(future); + } + MyList allIndices = new MyLinkedList<>(); + try { + for (int i = 0; i < futures.size(); i++) { + Future> future = futures.get(i); + MyList partialResult = future.get(); + + if (partialResult != null) { + for (int j = 0; j < partialResult.size(); j++) { + allIndices.add(partialResult.get(j)); + } } - MyList allIndices = new MyLinkedList<>(); - try { - for (int i = 0; i < futures.size(); i++) { - Future> future = futures.get(i); - MyList partialResult = future.get(); - - if (partialResult != null) { - for (int j = 0; j < partialResult.size(); j++) { - allIndices.add(partialResult.get(j)); - } - } - } - } catch (Exception e) { - throw new RuntimeException("Ошибка при поиске", e); - } finally { - executor.shutdown(); - } - - sortList(allIndices); - - int[] resultArray = new int[allIndices.size()]; - for (int i = 0; i < allIndices.size(); i++) { - resultArray[i] = allIndices.get(i); - } - - return resultArray; + } + } catch (Exception e) { + throw new RuntimeException("Ошибка при поиске", e); + } finally { + executor.shutdown(); } - private void sortList(MyList list) { - if (list.size() <= 1) return; + sortList(allIndices); - MyList sorted = new MyLinkedList<>(); - - for (int i = 0; i < list.size(); i++) { - int value = list.get(i); - int insertIndex = 0; - while (insertIndex < sorted.size()) { - if (sorted.get(insertIndex) > value) { - break; - } - insertIndex++; - } - - MyList temp = new MyLinkedList<>(); - for (int k = 0; k < insertIndex; k++) { - temp.add(sorted.get(k)); - } - temp.add(value); - for (int k = insertIndex; k < sorted.size(); k++) { - temp.add(sorted.get(k)); - } - sorted = temp; - } - - while (!list.isEmpty()) { - list.remove(0); - } - - for (int i = 0; i < sorted.size(); i++) { - list.add(sorted.get(i)); - } + int[] resultArray = new int[allIndices.size()]; + for (int i = 0; i < allIndices.size(); i++) { + resultArray[i] = allIndices.get(i); } - private int calculateThreadCount(int size) { - int processors = Runtime.getRuntime().availableProcessors(); - return Math.min(processors, size); - } + return resultArray; + } - private int countChunkSize(int size, int threadCount) { - if (threadCount == 0) return 0; - return (size + threadCount - 1) / threadCount; - } + private void sortList(MyList list) { + if (list.size() <= 1) return; - private MyList findInRange(MyList students, Student target, int fromIndex, int toIndex) { - MyList foundIndices = new MyLinkedList<>(); + MyList sorted = new MyLinkedList<>(); - for (int i = fromIndex; i < toIndex; i++) { - Student current = students.get(i); - if (current != null && current.equals(target)) { - foundIndices.add(i); - } + for (int i = 0; i < list.size(); i++) { + int value = list.get(i); + int insertIndex = 0; + while (insertIndex < sorted.size()) { + if (sorted.get(insertIndex) > value) { + break; } + insertIndex++; + } - return foundIndices; + MyList temp = new MyLinkedList<>(); + for (int k = 0; k < insertIndex; k++) { + temp.add(sorted.get(k)); + } + temp.add(value); + for (int k = insertIndex; k < sorted.size(); k++) { + temp.add(sorted.get(k)); + } + sorted = temp; } + + while (!list.isEmpty()) { + list.remove(0); + } + + for (int i = 0; i < sorted.size(); i++) { + list.add(sorted.get(i)); + } + } + + private int calculateThreadCount(int size) { + int processors = Runtime.getRuntime().availableProcessors(); + return Math.min(processors, size); + } + + private int countChunkSize(int size, int threadCount) { + if (threadCount == 0) return 0; + return (size + threadCount - 1) / threadCount; + } + + private MyList findInRange( + MyList students, Student target, int fromIndex, int toIndex) { + MyList foundIndices = new MyLinkedList<>(); + + for (int i = fromIndex; i < toIndex; i++) { + Student current = students.get(i); + if (current != null && current.equals(target)) { + foundIndices.add(i); + } + } + + return foundIndices; + } } diff --git a/app/src/main/java/ru/project/search/StudentSearchService.java b/app/src/main/java/ru/project/search/StudentSearchService.java index 4ced3c9..dc3a366 100644 --- a/app/src/main/java/ru/project/search/StudentSearchService.java +++ b/app/src/main/java/ru/project/search/StudentSearchService.java @@ -1,30 +1,30 @@ package ru.project.search; -import ru.project.list.MyList; -import ru.project.list.MyLinkedList; +import ru.project.collection.MyLinkedList; +import ru.project.collection.MyList; import ru.project.student.Student; public class StudentSearchService { - private final StudentSearchCriteria criteria; + private final StudentSearchCriteria criteria; - public StudentSearchService(StudentSearchCriteria criteria) { - if (criteria == null) { - throw new IllegalArgumentException("Criteria must not be null"); - } - this.criteria = criteria; + public StudentSearchService(StudentSearchCriteria criteria) { + if (criteria == null) { + throw new IllegalArgumentException("Criteria must not be null"); } + this.criteria = criteria; + } - public MyList find(MyList students) { - if (students == null) { - return new MyLinkedList<>(); - } - MyList result = new MyLinkedList<>(); - for (int i = 0; i < students.size(); i++) { - Student s = students.get(i); - if (criteria.matches(s)) { - result.add(s); - } - } - return result; + public MyList find(MyList students) { + if (students == null) { + return new MyLinkedList<>(); } -} \ No newline at end of file + MyList result = new MyLinkedList<>(); + for (int i = 0; i < students.size(); i++) { + Student s = students.get(i); + if (criteria.matches(s)) { + result.add(s); + } + } + return result; + } +}