java中如何计算两个list的差集,并集,交集等,举一个详细的实例说明。

在Java中,可以使用Java 8及以后版本的Stream API来高效地计算两个List之间的差集、并集和交集。下面我将通过具体的例子来展示如何实现这些集合操作。

示例类定义

首先,我们定义一个简单的Person类来作为我们的数据模型:

深色版本

复制代码
1public class Person {
2    private String name;
3    private int age;
4
5    public Person(String name, int age) {
6        this.name = name;
7        this.age = age;
8    }
9
10    public String getName() {
11        return name;
12    }
13
14    public int getAge() {
15        return age;
16    }
17
18    @Override
19    public boolean equals(Object o) {
20        if (this == o) return true;
21        if (!(o instanceof Person)) return false;
22        Person person = (Person) o;
23        return getAge() == person.getAge() &&
24               getName().equals(person.getName());
25    }
26
27    @Override
28    public int hashCode() {
29        return Objects.hash(getName(), getAge());
30    }
31
32    @Override
33    public String toString() {
34        return "Person{" +
35               "name='" + name + '\'' +
36               ", age=" + age +
37               '}';
38    }
39}

计算交集、并集和差集

接下来,我们将定义一个方法来计算两个List<Person>的交集、并集和差集:

深色版本

复制代码
1import java.util.*;
2import java.util.stream.Collectors;
3
4public class CollectionOperations {
5
6    public static void main(String[] args) {
7        List<Person> list1 = Arrays.asList(
8                new Person("Alice", 25),
9                new Person("Bob", 30),
10                new Person("Charlie", 35),
11                new Person("David", 40)
12        );
13
14        List<Person> list2 = Arrays.asList(
15                new Person("Bob", 30),
16                new Person("Charlie", 35),
17                new Person("Eve", 45),
18                new Person("Frank", 50)
19        );
20
21        // 计算交集
22        List<Person> intersection = computeIntersection(list1, list2);
23        System.out.println("交集: " + intersection);
24
25        // 计算并集
26        List<Person> union = computeUnion(list1, list2);
27        System.out.println("并集: " + union);
28
29        // 计算差集 (list1 - list2)
30        List<Person> difference1 = computeDifference(list1, list2);
31        System.out.println("差集 (list1 - list2): " + difference1);
32
33        // 计算差集 (list2 - list1)
34        List<Person> difference2 = computeDifference(list2, list1);
35        System.out.println("差集 (list2 - list1): " + difference2);
36    }
37
38    public static List<Person> computeIntersection(List<Person> list1, List<Person> list2) {
39        Set<Person> set1 = new HashSet<>(list1);
40        Set<Person> set2 = new HashSet<>(list2);
41
42        set1.retainAll(set2);
43        return new ArrayList<>(set1);
44    }
45
46    public static List<Person> computeUnion(List<Person> list1, List<Person> list2) {
47        Set<Person> set1 = new HashSet<>(list1);
48        set1.addAll(list2);
49        return new ArrayList<>(set1);
50    }
51
52    public static List<Person> computeDifference(List<Person> source, List<Person> toRemove) {
53        Set<Person> set1 = new HashSet<>(source);
54        set1.removeAll(new HashSet<>(toRemove));
55        return new ArrayList<>(set1);
56    }
57}
复制代码
// 自己写的计算交集
List<Person> intersection2 = list1.stream()
        .filter(list2::contains)
        .collect(Collectors.toList());
System.out.println("new jiaoji: " + intersection2);
// 自己写的计算差集
List<Person> fcSide = list1.stream()
        .filter(item -> !list2.contains(item))
        .collect(Collectors.toList());
System.out.println("new chaji: " + fcSide);

方法解释

  1. 计算交集 (computeIntersection):

    • 将两个列表转换为HashSet,利用HashSet的特性(不允许重复元素)来去除重复项。
    • 使用retainAll方法来保留两个集合中的共有元素。
  2. 计算并集 (computeUnion):

    • 同样先将列表转换为HashSet
    • 使用addAll方法将另一个集合中的元素添加到当前集合中,从而实现并集操作。
  3. 计算差集 (computeDifference):

    • 将源列表转换为HashSet
    • 使用removeAll方法移除另一个集合中的元素,从而留下仅存在于源集合中的元素。

输出结果

当运行上述代码时,你会得到以下输出:

复制代码

深色版本

复制代码
1交集: [Person{name='Bob', age=30}, Person{name='Charlie', age=35}]
2并集: [Person{name='Alice', age=25}, Person{name='Bob', age=30}, Person{name='Charlie', age=35}, Person{name='David', age=40}, Person{name='Eve', age=45}, Person{name='Frank', age=50}]
3差集 (list1 - list2): [Person{name='Alice', age=25}, Person{name='David', age=40}]
4差集 (list2 - list1): [Person{name='Eve', age=45}, Person{name='Frank', age=50}]

总结

通过上述方法,我们可以轻松地计算两个List之间的交集、并集和差集。这些操作对于数据比较和数据同步等场景非常有用。注意,在实际应用中,你需要确保你的对象具有正确的equalshashCode方法实现,以保证集合操作的正确性。

相关推荐
写代码写到手抽筋6 小时前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g
xieliyu.6 小时前
Java算法精讲:双指针(二)
java·开发语言·算法
jeffer_liu7 小时前
Spring AI 生产级实战:裁判员
java·人工智能·后端·spring·大模型
小bo波8 小时前
枚举实战
java·设计模式·枚举·后端开发·代码重构
夜微凉48 小时前
三、Spring
java·后端·spring
橘右今8 小时前
2026 Java后端高频面试宝典
java·开发语言·面试
Qiuner8 小时前
Pico 重塑Agent时代人与数据交互方式
windows·docker·ai·架构
FL16238631299 小时前
Windows x64 系统安装 ChromeDriver
windows
xyzzklk9 小时前
解决Salesforce无法向外发送邮件
android·java·开发语言·网络·crm·salesforce·客户关系管理