找出两个List集合重复的元素

本文介绍了两种找出两个List集合中重复元素的Java方法,包括将一个集合放入另一个集合进行比较以及Java8的简洁去重方法。强调在大量数据时需要注意效率,同时补充了Java8利用流处理实现的去重代码,适用于任意类型并要求对象重写了hashCode()和equals()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天,有个同事问我说怎么找出两个List集合中重复的元素,我当时就说一个集合在外面循环,一个集合在内循环,如果两个元素相等了,就找出来了,我回来一想还是不对,要是数据非常多,这样循环下去,服务器会卡死的,最后我想了想,用以下两种方法:

   List<String> list1 = new ArrayList<>();
            List<String> list2 = new ArrayList<>();
            list1.add("a");
            list1.add("b");
            list1.add("c");
            list1.add("d");
            list2.add("d");
            list2.add("f");
            list2.add("g");
            list2.add("h");
            list2.add("k");

第一种方法:这是把list1集合放到list2中

 list2.addAll(list1);
        HashMap<String,Integer> mapList=new HashMap<>();
        for(String str:list2){
            int count=0;
            if(mapList.get(str)!=null){
                count=mapList.get(str)+1;
            }
            mapList.put(str,count);
        }
        System.out.println("重复的元素是:");
        for(String key:mapList.keySet()){
            if(mapList.get(key)!=null && mapList.get(key)>0){
                System.out.println(key);
            }
        }

第二种方法:

   Map<String,String> map=new HashMap<>();
        String str=null;
        String stp=null;
        String psp=null;
        for(int i=0;i<list1.size();i++){
            str=list1.get(i);
            map.put(str,str);
        }
        for(String spt:map.keySet()){
            System.out.println("key:"+spt+"-----------value:"+map.get(spt));
        }
        System.out.println("==========="+map.entrySet());
        for(int i=0;i<list2.size();i++){
            stp=list2.get(i);
            if(stp.equals(map.get(str))){
                System.out.println("重复的元素:"+stp);
            }
        }

以上就是我用的两种方法,由于是个菜鸟,所以大神们有更好的方法望指点,在下感激不尽!


补充:
下面是java8新特性去list集合重复的方法,非常简单,比前的方法简单多了,
首先是将两个集合合并在一起,然后就是下面的方法:(list2是合并以后的集合,spa是去重复的新集合)

 List<String> spa = list2.stream()
                    .distinct()
                    .collect(Collectors.toList());

这种方法最简单,代码少,清晰明了!!!!


补充:
java8的方法中可以找出相同的元素 代码如下:

	public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("a");
        list.add("b");
        System.out.println(getDuplicateElements(list.stream()));
    }

    public static <T> List<T> getDuplicateElements(Stream<T> stream) {
        return stream.collect(Collectors.groupingBy(p -> p,Collectors.counting()))
                .entrySet().stream() // Set<Entry>转换为Stream<Entry>
                .filter(entry -> entry.getValue() > 1) // 过滤出元素出现次数大于 1 的 entry
                .map(entry -> entry.getKey()) // 获得 entry 的键(重复元素)对应的 Stream
                .collect(Collectors.toList()); // 转化为 List
    }

执行结果如下:

[a, b]

由于在方法中使用了泛型,所以可以接收任意类型的流,注意在如果是对象,别忘了重写其 hashCode() 和 equals() 方法。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值