Этот метод использует операции фильтра и сбора Stream API для поиска пересечения двух списков.
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
List<Integer> intersection = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());
Этот метод реализует пересечение, проходя по одному списку и проверяя, присутствуют ли его элементы в другом списке.
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
List<Integer> intersection = new ArrayList<>();
for (Integer item : list1) {
if (list2.contains(item)) {
intersection.add(item);
}
}
использоватьHashSet
Оптимизировать метод обхода:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ListIntersection {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
Set<Integer> set1 = new HashSet<>(list1);
List<Integer> intersection = new ArrayList<>();
for (Integer num : list2) {
if (set1.contains(num)) {
intersection.add(num);
}
}
System.out.println("Пересечение:" + intersection);
}
}
Воляlist1
Преобразовать вHashSet
,для повышения эффективности поиска. Затем,Мы пересекаемlist2
,и проверьте, существует ли его элемент вset1
середина。если существует,затем добавьте его в список пересечений. пожалуйста, обрати внимание,потому чтоHashSet
Порядок элементов не гарантируется,Таким образом, порядок элементов в списке пересечений может отличаться от исходного списка. Если вам нужно сохранить порядок,МожетиспользоватьLinkedHashSet
заменятьHashSet
。
Этот метод сначала преобразует два списка в Set, а затем использует метод continueAll Set для поиска пересечения. Метод saveAll сохраняет элементы, существующие в указанной коллекции (параметрах).
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
Set<Integer> set1 = new HashSet<>(list1);
Set<Integer> set2 = new HashSet<>(list2);
set1.retainAll(set2); // set1 теперь содержит только элементы пересечения
List<Integer> intersection = new ArrayList<>(set1);
Если ваш проект уже включает библиотеку коллекций Apache Commons, вы можете использовать предоставляемый ею класс CollectionUtils, чтобы легко находить пересечения.
import org.apache.commons.collections4.CollectionUtils;
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
List<Integer> intersection = (List<Integer>) CollectionUtils.intersection(list1, list2);
Примечание: Апач Commons CollectionsБиблиотекасерединаизintersection
Метод возвращаетjava.util.Collection
тип,Поэтому требуется преобразование типов.
anyMatch
Уже использовался ранееfilter
Метод показываетнравитьсячтоиспользоватьStream API для поиска пересечения,Но его также можно использоватьanyMatch
добиться чего-то вродеиз Функция。но,Обычно этот подход не самый эффективный.,Потому что для каждого элемента требуется проверка обхода.
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
List<Integer> intersection = list1.stream()
.filter(item -> list2.stream().anyMatch(item::equals))
.collect(Collectors.toList());
Примечание. Этот метод имеет более высокую временную сложность.,Потому что дляlist1
серединаизкаждый элемент,Он пройдет всюlist2
。поэтому,Для больших списков,Этот метод не рекомендуется.
Если список большой и ваша машина имеет несколько ядер процессора, вы можете рассмотреть возможность использования параллельных потоков, чтобы ускорить вычисление пересечения.
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
Set<Integer> set2 = new HashSet<>(list2); // Используйте HashSet для повышения эффективности поиска
List<Integer> intersection = list1.parallelStream()
.filter(set2::contains)
.collect(Collectors.toList());
Примечание. Параллельные потоки не всегда быстрее последовательных, особенно при работе с небольшими наборами данных или наборами данных, которые не подходят для параллельной обработки. Кроме того, использование параллельных потоков также увеличит накладные расходы потоков.
Если вы имеете дело с очень большими наборами данных,и хотите воспользоваться мощью многоядерных процессоров,Вы можете рассмотреть возможность использования Java-инструментов параллелизма.,нравитьсяForkJoinPool
,для расчета пересечения параллельно.
Этот метод более сложный,Обычно используется в сложных сценариях параллельного программирования. Основная идея — разделить большие задачи на маленькие.,ЗатемиспользоватьForkJoinPool
обрабатывать эти небольшие задачи параллельно,и, наконец, объединить результаты.
Помимо коллекций Apache Commons, другие сторонние библиотеки, такие как Guava, также предоставляют классы инструментов для операций сбора.
Например,использоватьGuavaизSets.intersection(Set<E> set1, Set<E> set2)
Методы можно легко найти с помощью двухсобиратьизпересечение:
import com.google.common.collect.Sets;
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
Set<Integer> set1 = new HashSet<>(list1);
Set<Integer> set2 = new HashSet<>(list2);
Set<Integer> intersectionSet = Sets.intersection(set1, set2);
List<Integer> intersection = new ArrayList<>(intersectionSet);
Уведомление:GuavaизSets.intersection
Метод возвращает Неизменяемыйизвид,Он представляет собой пересечение двух примитивных сборов. Это представление меняется по мере исходного сбора.,Но сам по себе он не занимает дополнительного места. Если вам нужен независимый перекресток, собирайте,Вы можете скопировать в новый ArrayList, как указано выше.
Я надеюсь, что введение и практика вышеупомянутых методов помогут вам лучше понять расчет пересечения коллекций списков в Java и иметь возможность гибко использовать его в реальной разработке.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
код тридцать пять
』 , для получения дополнительной технической информации.