Назад к вопросам
Senior
8
Есть два файла, каждый содержит целочисленные значения построчно. Какими алгоритмами можно найти пересечение этих двух множеств?
Компании, где спрашивали
Umbrella IT
Ответ от нейросети
sobes.tech AI
Для поиска пересечения двух множеств целочисленных значений из файлов можно использовать несколько подходов:
-
Считывание в множества (Set)
- Считать все значения из первого файла в HashSet.
- Считать значения из второго файла по одному и проверять наличие в первом множестве.
- Все совпадающие элементы — пересечение.
-
Сортировка и двухуказательный метод
- Считать оба файла в массивы.
- Отсортировать оба массива.
- Использовать два указателя для одновременного прохода по массивам и поиска общих элементов.
-
Использование потоков и фильтрации (Java 8+)
- Считать файлы как Stream<Integer>.
- Преобразовать один поток в Set для быстрого поиска.
- Отфильтровать второй поток по наличию в этом Set.
Пример с использованием HashSet:
import java.nio.file.*;
import java.io.IOException;
import java.util.*;
public class IntersectionFinder {
public static Set<Integer> findIntersection(Path file1, Path file2) throws IOException {
Set<Integer> set1 = new HashSet<>();
try (Stream<String> lines = Files.lines(file1)) {
lines.map(Integer::parseInt).forEach(set1::add);
}
Set<Integer> intersection = new HashSet<>();
try (Stream<String> lines = Files.lines(file2)) {
lines.map(Integer::parseInt)
.filter(set1::contains)
.forEach(intersection::add);
}
return intersection;
}
}
Этот метод эффективен при большом объёме данных, так как операции с HashSet имеют амортизированную сложность O(1).