根据单个或多个字段对list对象去重

2019-10-16 08:17:31来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

根据单个或多个字段对list对象去重

pojo  省略  

在list 对象中,根据某一字段进行去重,重写Comparator

 1     /**
 2      * 去重
 3      * 
 4      * @param orderList
 5      * @return
 6      * @author ziggo
 7      */
 8     private static List<Drug> removeDuplicateOrder(List<Drug> orderList) {
 9         Set<Drug> set = new TreeSet<Drug>(new Comparator<Drug>() {
10             @Override
11             public int compare(Drug a, Drug b) {
12                 // 字符串则按照asicc码升序排列
13                 return a.getName().compareTo(b.getName());
14             }
15         });
17         set.addAll(orderList);
18         return new ArrayList<Drug>(set);
19     }

在list 对象中,根据多个字段进行去重,重写Comparator

    /**
     * 去重(废弃,多条件下莫名失效)
     * 
     * @param orderList
     * @return
     * @author ziggo
     */
    private static List<Drug> removeDuplicateOrder(List<Drug> orderList) {
        Set<Drug> set = new TreeSet<Drug>(new Comparator<Drug>() {
            @Override
            public int compare(Drug a, Drug b) {
                int compareToResult = 1;// ==0表示重复
                // 字符串则按照asicc码升序排列
                if (a.getName().equals(b.getName()) && a.getDepartment().equals(b.getDepartment())) {
                    compareToResult = 0;
                }
                return compareToResult;
            }
        });

        set.addAll(orderList);
        return new ArrayList<Drug>(set);
    }

进行重写Comparator根据多个字段去重时,发现该方法不能正常去重,目前还没排查到什么原因,于是查找了另外一种方式,在pojo中重写equals方法

实体类:DRUG

package com.msun.mr.app.pojo;

/**
 * @author d_hb 药品信息
 */
public class Drug {
    /**

 省略字段部分
********************************


*/
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        Drug drug = (Drug) obj;
        if (this.getName() .compareTo(drug.getName())==0
                && this.getDepartment().equals(drug.getDepartment()) && this.getSpec_id().equals(drug.getSpec_id())){
            return true;
        }
        return false;
    }
}

 

 判断重复逻辑,同时满足三个字段时,去重

    // 去重(重写equals方法)
    private static List<Drug> removeDuplicateInvoice(List<Drug> orderList) {
        List<Drug> list = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(orderList)) {
            for (Drug drug : orderList) {
                // list去重复,内部重写equals
                if (!list.contains(drug)) {
                    list.add(drug);
                }
            }
        }
        return list;
    }

所以,目前代码使用的去重逻辑是:单个字段去重时重写了Comparator,多个字段去重时,重写equals方法.不过我感觉多个字段去重同样使用重写Comparator方法也能实现,暂时定位不到问题............

 


原文链接:https://www.cnblogs.com/by-xu/p/11683742.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:SpringBoot源码分析之---SpringBoot项目启动类SpringApplication

下一篇:北漂的生活成本到底有多大?