java求集合的交集、差集和并集

一、本文介绍两种写法

1原生写法

2com.google.guava写法
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

二、代码

import com.google.common.collect.Sets;

import java.util.HashSet;
import java.util.Set;

/**
 * java求集合的交集、差集和并集
 */
public class CollectionOperation {

    public static void main(String[] args) {
        Set<Integer> result = new HashSet<Integer>();

        //双括号语法 -> 本质是: 匿名内部类 + 实例化代码块
        //改写之后的代码就非常容易理解了。显然这是在HashSet的构造器中写了一个匿名内部类,这个匿名内部类含有一个实例初始化块
        //初始化块的内容是三个add()函数,向被初始化的this指向的HashSet中添加了三个元素。
        Set<Integer> set1 = new HashSet<Integer>() {
            private static final long serialVersionUID = 1L;

            {
                add(1);
                add(3);
                add(5);
            }
        };

        Set<Integer> set2 = new HashSet<Integer>() {
            private static final long serialVersionUID = 1L;

            {
                add(1);
                add(2);
                add(3);
            }
        };
        System.out.println("set1 " + set1);
        System.out.println("set2 " + set2);
        //原生写法
        System.out.println("原生写法 ===================");
        test1(result, set1, set2);

        //com.google.guava写法
        System.out.println("com.google.guava写法 ===================");
        test2(result, set1, set2);

    }

    public static void test1(Set<Integer> result, Set<Integer> set1, Set<Integer> set2) {
        //交集
        result.clear();
        result.addAll(set1);
        result.retainAll(set2);
        System.out.println("交集:" + result);

        //差集
        result.clear();
        result.addAll(set1);
        result.removeAll(set2);
        System.out.println("差集:" + result);

        //并集
        result.clear();
        result.addAll(set1);
        result.addAll(set2);
        System.out.println("并集:" + result);
    }

    public static void test2(Set<Integer> result, Set<Integer> set1, Set<Integer> set2) {
        //交集
        Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);
        System.out.println("交集:" + intersection.immutableCopy()); // 可以使用交集,但不可变拷贝的读取效率更高

        //差集
        Sets.SetView<Integer> difference = Sets.difference(set1, set2);
        System.out.println("差集:" + difference.immutableCopy());

        //并集
        Sets.SetView<Integer> union = Sets.union(set1, set2);
        System.out.println("并集:" + union.immutableCopy());
    }

}

三、输出

set1 [1, 3, 5]
set2 [1, 2, 3]
原生写法 ===================
交集:[1, 3]
差集:[5]
并集:[1, 2, 3, 5]
com.google.guava写法 ===================
交集:[1, 3]
差集:[5]
并集:[1, 3, 5, 2]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值