Java 取集合的差集,list集合或者map集合,都可以取差集。使用guava工具类来做。而不是重复的造轮子。

在使用集合的时候,我们有时候需要取两个集合的差集,这两个集合一般是List类型的集合。
一般情况下,要是我们自己去造轮子的话 ,那也简单。
只是。因人而异,造出来的轮子的质量也是参差不齐。
既如此,何不使用别人已经造好的,专业的轮胎呢?
下面的代码呢,是我自己实现的取list和map的差集的方法。主要是基于guava工具类的实现。
具体看代码吧。

package com.lxk.collectionTest;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 取两个集合的差集
 * <p>
 * Created by lxk on 2017/2/17
 */
public class GetDifferenceSet {
    public static void main(String[] args) {
        List<String> big = Lists.newArrayList("1", "2", "3", "4", "5", "6", "7", "8", "9");
        List<String> small = Lists.newArrayList("1", "2", "3", "3", "2", "1");
        long a=System.currentTimeMillis();
        List<String> guava = getDifferenceSetByGuava(big, small);
        System.out.println("\r<br> 执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");
        //为了显示一致,我给集合排个序,因为guava是按newHashSet集合来整的,newHashSet又是无序的,so ...
        Collections.sort(guava);
        a=System.currentTimeMillis();
        List<String> my = getDifferenceSetByMyself(big, small);
        System.out.println("\r<br> 执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");
        System.out.println(guava.toString());
        System.out.println(my.toString());

        Map<String, String> bigMap = Maps.newHashMap();
        bigMap.put("1", "1");
        bigMap.put("2", "2");
        bigMap.put("3", "3");
        bigMap.put("4", "4");
        Map<String, String> smallMap = Maps.newHashMap();
        smallMap.put("1", "1");
        smallMap.put("2", "2");
        a=System.currentTimeMillis();
        Map<String, String> guavaMap = getDifferenceSetByGuava(bigMap, smallMap);
        System.out.println("\r<br> 执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");
        System.out.println(guavaMap);
    }

    /**
     * 使用guava工具类来取List集合的差集--专业轮子谷歌造
     *
     * @param big   大集合
     * @param small 小集合
     * @return 两个集合的差集
     */
    private static List<String> getDifferenceSetByGuava(List<String> big, List<String> small) {
        Set<String> differenceSet = Sets.difference(Sets.newHashSet(big), Sets.newHashSet(small));
        return Lists.newArrayList(differenceSet);
    }

    /**
     * 自己实现取List集合的差集--自制轮子大师兄造
     *
     * @param big   大集合
     * @param small 小集合
     * @return 两个集合的差集
     */
    private static List<String> getDifferenceSetByMyself(List<String> big, List<String> small) {
        Set<String> sameString = Sets.newHashSet();
        for (String s : small) {
            sameString.add(s);
        }
        List<String> result = Lists.newArrayList();
        for (String s : big) {
            if (sameString.add(s)) {
                result.add(s);
            }
        }
        return result;
    }

    /**
     * 自己实现取Map集合的差集--站在巨人的肩膀上造轮子
     *
     * @param bigMap   大集合
     * @param smallMap 小集合
     * @return 两个集合的差集
     */
    private static Map<String, String> getDifferenceSetByGuava(Map<String, String> bigMap, Map<String, String> smallMap) {
        Set<String> bigMapKey = bigMap.keySet();
        Set<String> smallMapKey = smallMap.keySet();
        Set<String> differenceSet = Sets.difference(bigMapKey, smallMapKey);
        Map<String, String> result = Maps.newHashMap();
        for (String key : differenceSet) {
            result.put(key, bigMap.get(key));
        }
        return result;
    }
}



代码运行结果,如下图:


关于,后面去hashmap集合的差集的思路:

首先hashmap的不同都是跟key相关的,key不同,那就是不同的map。然后就根据这个key来处理,就可以取出差集啦。

关于,执行时间问题。

惊讶的发现,使用工具类执行时间反而有点慢,虽然只是0,023秒,估计是优化了吧,可能小数据量看不出来优劣。

就像,stringBuffer或者stringBuilder,在乍一看的时候,好像比直接使用字符串慢一样。但,他之所以存在,肯定是有好处的。

不然,谷歌那一帮人,干嘛整个这个出来。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值