Collection 差交并集

一、List

1、法一:List 自带函数

推荐阅读:java-----求两个list的交集、并集、和差集

List list1 =new ArrayList();
list1.add("1111");
list1.add("2222");
list1.add("3333");
  
List list2 =new ArrayList();
list2.add("3333");
list2.add("4444");
list2.add("5555");
  
//并集
list1.addAll(list2);

//交集
list1.retainAll(list2);

//差集
list1.removeAll(list2);

//无重复并集
list2.removeAll(list1);
list1.addAll(list2);

慎用:

  • addAll:直接修改第一个list,把第 2 个 list 中的数据添加到第一个 list 中
  • retainAll:直接修改第一个list,返回 boolean,若修改了第一个 list 就返回 true,没修改就返回 false
  • removeAll:直接修改第一个list,使用第一个 list 的内容去减第 2 个 list

2、法二:guava Sets 方法

将 List 转为 Set,然后通过 guava 进行操作:

public class Test04 {
	public static void main(String[] args) {
		Set<Integer> sets = Sets.newHashSet(1, 2, 3, 4, 5, 6);
        Set<Integer> sets2 = Sets.newHashSet(3, 4, 5, 6, 7, 8, 9);
        // 交集
        System.out.println("交集为:");
        Sets.SetView<Integer> intersection = Sets.intersection(sets, sets2);
        for (Integer temp : intersection) {
            System.out.print(temp + " ");
        }
        System.out.println();

        // 差集
        System.out.println("差集为:");
        Sets.SetView<Integer> diff = Sets.difference(sets, sets2);
        for (Integer temp : diff) {
            System.out.print(temp + " ");
        }
        System.out.println();

        // 并集
        System.out.println("并集为:");
        Sets.SetView<Integer> union = Sets.union(sets, sets2);
        for (Integer temp : union) {
            System.out.print(temp + " ");
        }
	}
}

//结果:
交集为:
3 4 5 6 
差集为:
1 2 
并集为:
1 2 3 4 5 6 7 8 9 

二、Map

	@Test
    public void test2() {
        Map<Integer, List<String>> oldMap = Maps.newHashMap();
        oldMap.put(10, Lists.newArrayList("v1", "v2", "v3"));
        oldMap.put(55, Lists.newArrayList("v2", "v3"));
        oldMap.put(56, Lists.newArrayList("v3"));
        oldMap.put(58, Lists.newArrayList("v3"));

        Map<Integer, List<String>> newMap = Maps.newHashMap();
        newMap.put(10, Lists.newArrayList("v1", "v2", "v3"));
        newMap.put(55, Lists.newArrayList("v2", "v3"));
        newMap.put(56, Lists.newArrayList("v2", "v3"));
        newMap.put(59, Lists.newArrayList("v2", "v3"));

        System.out.println(oldMap); //{55=[v2, v3], 56=[v3], 10=[v1, v2, v3], 58=[v3]}
        System.out.println(newMap); //{55=[v2, v3], 56=[v2, v3], 10=[v1, v2, v3], 59=[v2, v3]}
        System.out.println("--------");

        //交集
        MapDifference<Integer, List<String>> di = Maps.difference(oldMap, newMap);
        Map<Integer, List<String>> commonMap = di.entriesInCommon();
        System.out.println(commonMap); //{55=[v2, v3], 10=[v1, v2, v3]}
        System.out.println("--------");

        //差集
        for (Map.Entry<Integer, List<String>> entry : commonMap.entrySet()) {
            newMap.remove(entry.getKey());
        }
        System.out.println(newMap); //{56=[v2, v3], 59=[v2, v3]}
        System.out.println("--------");

        //差集(包含左右两个不同的值)
        Map<Integer, MapDifference.ValueDifference<List<String>>> diffMap = di.entriesDiffering();
        System.out.println(diffMap); //{56=([v3], [v2, v3])}
        System.out.println("--------");

        //键只存在于左边 Map 的映射项
        Map<Integer, List<String>> leftMap = di.entriesOnlyOnLeft();
        System.out.println(leftMap); //{58=[v3]}
        System.out.println("--------");

        //键只存在于右边 Map 的映射项
        Map<Integer, List<String>> rightMap = di.entriesOnlyOnRight();
        System.out.println(rightMap); //{59=[v2, v3]}
        System.out.println("--------");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值