在 Java 中,求两个列表的交集可以使用多种方法实现。下面我将为您介绍三种常见的实现方式,包括使用循环、使用 Java 8 Stream 和使用 Google Guava 库。对于每种方式,我将提供详细的步骤流程以及示例代码,并为 Guava 方法提供相应的 Maven 和 Gradle 依赖坐标。
这是一种最基本的方法,适用于较小的列表。基本思路是对其中一个列表的每个元素,检查是否存在于另一个列表中。
import java.util.ArrayList;
import java.util.List;
public class ListIntersection {
public static <T> List<T> getIntersection(List<T> list1, List<T> list2) {
List<T> intersection = new ArrayList<>();
for (T element : list1) {
if (list2.contains(element)) {
intersection.add(element);
}
}
return intersection;
}
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>(List.of(1, 2, 3, 4, 5));
List<Integer> list2 = new ArrayList<>(List.of(3, 4, 5, 6, 7));
List<Integer> intersection = getIntersection(list1, list2);
System.out.println(intersection); // Output: [3, 4, 5]
}
}
Java 8 引入了 Stream API,使集合操作更加简洁和表达性强。通过将列表转换为流,可以很容易地求交集。
import java.util.List;
import java.util.stream.Collectors;
public class ListIntersection {
public static <T> List<T> getIntersection(List<T> list1, List<T> list2) {
return list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());
}
public static void main(String[] args) {
List<Integer> list1 = List.of(1, 2, 3, 4, 5);
List<Integer> list2 = List.of(3, 4, 5, 6, 7);
List<Integer> intersection = getIntersection(list1, list2);
System.out.println(intersection); // Output: [3, 4, 5]
}
}
Google Guava 是一个常用的 Java 库,提供了许多方便的集合操作方法,包括求交集。
首先,您需要在项目中添加 Guava 依赖:
Maven 依赖坐标:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Gradle 依赖坐标:
implementation 'com.google.guava:guava:31.0.1-jre'
然后,可以使用 Guava 的 Sets.intersection()
方法来求交集。
import com.google.common.collect.Sets;
import java.util.List;
import java.util.Set;
public class ListIntersection {
public static <T> Set<T> getIntersection(List<T> list1, List<T> list2) {
Set<T> set1 = Sets.newHashSet(list1);
Set<T> set2 = Sets.newHashSet(list2);
return Sets.intersection(set1, set2);
}
public static void main(String[] args) {
List<Integer> list1 = List.of(1, 2, 3, 4, 5);
List<Integer> list2 = List.of(3, 4, 5, 6, 7);
Set<Integer> intersection = getIntersection(list1, list2);
System.out.println(intersection); // Output: [3, 4, 5]
}
}
无论您选择哪种方法,都可以根据您的项目需求和数据规模来进行选择。循环方法适用于小型列表,Stream API 简洁易读,而 Guava 提供了更多集合操作的便捷方法。