对List集合、数组去重

前言:

还记得在2021我发布的第一篇博客就是关于数组的去重,从那一刻开始,命运的齿轮开始转动……

扯远了哈哈哈,我重新写这篇文章只是想让去重方式更加严谨(ps:我才不会说是因为技术成长了,看不上之前写的了哈哈哈

方式一:

 依据Set集合的特性,使用set去重(最简洁高效)

/**
 * 使用set去重
 *
 * @param list
 */
private void setDistinct(List<String> list) {
    System.out.println("Set 开始去重,条数:" + list.size());
    List<String> listDistinctResult = new ArrayList<>(new HashSet(list));
    System.out.println("Set 去重完毕,条数:" + listDistinctResult.size());
}

方式二:

 使用高级的stream流方式去重(可读性高,效率高)

/**
 * 使用Stream 去重
 *
 * @param list
 */
private void useStreamDistinct(List<String> list) {
    System.out.println("stream 开始去重,条数:" + list.size());
    List<String> listDistinctResult = list.stream().distinct().collect(Collectors.toList());
    System.out.println("stream 去重完毕,条数:" + listDistinctResult.size());
}

方式三:

 使用list.contain去重(效率一般)

/**
 * 使用 list.contain 去重,返回一个新集合
 *
 * @param list
 */
private void listContainDistinct(List<String> list) {
    System.out.println("contains 开始去重,旧集合条数:" + list.size());
    List<String> listDistinctResult = new ArrayList<>();
    for (String str : list) {
        if (!listDistinctResult.contains(str)) {
            listDistinctResult.add(str);
        }
    }
    System.out.println("contains 去重完毕,新集合条数:" + listDistinctResult.size());
}

方式四:

喜闻乐见的for循环去重(最常见,数据量大不建议使用)

/**
 * 使用for循环去重
 * @param list
 */
private void useForDistinct(List<String> list) {
    System.out.println("list 双循环 开始去重,条数:" + list.size());
    for (int i = 0; i < list.size(); i++) {
        for (int j = i + 1; j < list.size(); j++) {
            if (list.get(i).equals(list.get(j))) {
                list.remove(j);
            }
        }
    }
    System.out.println("list 双循环  去重完毕,条数:" + list.size());
}

特殊情况:

以上都是简单的list集合去重,但是当我们遇到一些特殊情况,比如:当一个集合中存的是Map,Map中有一些键值是重复,而我们需要去除这些重复的对象;以上的三种方式就不太适用了,这种情况就只能使用多层级for循环来做了(这种复杂情况应该可以使用stream来做,不过没试过就不说了),当然数据量大的话肯定效率是比较吃紧的,因此如果在不需要数据实时同步的情况下,可以考虑新开线程去执行这个去重然后走之后的业务流程

这种特殊情况的代码如下:

/**
     * 数组去重
     * (目前仅针对于前三列相同进行去重;
     * 例如:业务层面来讲:即当用户名,身份证,手机号,邮箱等重要信息都相同时,
     * 去除这一重复数据)
     * 
     * @param dataList
     * @return
     */
    private List<Map<Integer, String>> removeSameMapData(List<Map<Integer, String>> dataList) {
        int i = 0;
        List<Map<Integer, String>> distinctList = new ArrayList<>();
        for (Map<Integer, String> map : dataList) {
            boolean isDuplicate = false;
            for (Map<Integer, String> distinctMap : distinctList) {
                for (Map.Entry<Integer, String> entry : map.entrySet()) {
                    Integer key = entry.getKey();
                    if (key <= 3 && StringUtils.equals(map.get(key), distinctMap.get(key))){
                        i ++;
                    }
                    if (i >= 3){
                        i = 0;
                        isDuplicate = true;
                        break;
                    }
                }
            }
            if (!isDuplicate) {
                distinctList.add(map);
            }
        }
        return distinctList;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值