08_List集合去重及排序

@Author Jacky Wang

日常積累,轉(zhuǎn)載請注明出處,http://www.itdecent.cn/p/0cf21d08b78e

一. List集合排序

需求:根據(jù)List集合中商品對象的銷售狀態(tài)進行排序,未支付的商品放在前面,已支付的放在后面

List<WXPrepayStockVO> appletShowGoodsInfo = appletGoodsInfoShow(stockVO);
// 根據(jù)銷售狀態(tài)排序,方便前臺展示
Collections.sort(appletShowGoodsInfo, new Comparator<WXPrepayStockVO>() {

    @Override
    public int compare(WXPrepayStockVO o1, WXPrepayStockVO o2) {
        String ss1 = o1.getSaleStatus();
        String ss2 = o2.getSaleStatus();
        // 正序排序
        return ss1.compareTo(ss2);
        // 倒序排序
        // return ss2.compareTo(ss2);
    }
});

1.1 Collections.sort()的兩種用法

Collections是一個工具類,sort是其中的靜態(tài)方法,是用來對List類型進行排序的,它有兩種參數(shù)形式:

1. 
public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

2. 
public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

1.2 兩種用法的區(qū)別及示例

Collections.sort()默認正序排序。上述兩種方式都支持排序,那兩者的區(qū)別在哪呢?

1. 兩種方式都支持默認的正序排序,但對于普通類型例如Integer,如果需要逆序排序,第一種方式就不能實現(xiàn)了。
此處用Integer演示第一種方式:

List<Integer> intList = Arrays.asList(2, 3, 1);
Collections.sort(intList);
PrintUtil.showList(intList);

打印結(jié)果為: 1,2,3

如果要實現(xiàn)逆序就得用第二種方式了:

Collections.sort(intList,new Comparator<Integer>() {

    @Override
    public int compare(Integer o1, Integer o2) {
        // 返回值為int類型,大于0表示正序,小于0表示逆序
        return o2-o1;
    }
});
System.out.println("after sort:");
PrintUtil.showList(intList);

打印結(jié)果為: 3,2,1
    

2. 對于自定義類的排序,兩種方式都可以實現(xiàn),不同的是第一種方式在實體類中實現(xiàn)Comparable接口的CompareTo方法排序,第二種方式在sort方法中實現(xiàn)compareTo方法進行排序。

以上述需求為例,以銷售狀態(tài)排序,CompareTo方法事實上比較的是Unicode碼的大小:

第一種方式實現(xiàn):(實體類中實現(xiàn)Comparable接口)

public class WXPrepayStockVO implements Serializable,Comparable<WXPrepayStockVO> {

    private static final long serialVersionUID = -4198487626404096752L;

    private String mpName; // 商品單品名
    private String mpPrice;// 單品銷售價
    private String mpVipPrice;// 單品會員價
    private Long qty;// 銷售數(shù)量
    private String saleStatus;// 銷售狀態(tài)
    private List<String> epcs;

    public String getSaleStatus() {
        return saleStatus;
    }

    public void setSaleStatus(String saleStatus) {
        this.saleStatus = saleStatus;
    }

    @Override
    public int compareTo(WXPrepayStockVO o) {
        //按銷售狀態(tài)正序排序
        return this.getSaleStatus().compareTo(o.getSaleStatus());
        // 按銷售狀態(tài)逆序排序
        // return o.getSaleStatus().compareTo(this.getSaleStatus());
    }
}

則在使用時直接調(diào)用:Collections.sort(list);排序即可。

第二種方式實現(xiàn):

List<WXPrepayStockVO> appletShowGoodsInfo = appletGoodsInfoShow(stockVO);
// 根據(jù)銷售狀態(tài)排序,方便前臺展示
Collections.sort(appletShowGoodsInfo, new Comparator<WXPrepayStockVO>() {

    @Override
    public int compare(WXPrepayStockVO o1, WXPrepayStockVO o2) {
        String ss1 = o1.getSaleStatus();
        String ss2 = o2.getSaleStatus();
        // 正序排序
        return ss1.compareTo(ss2);
        // 倒序排序
        // return ss2.compareTo(ss2);
    }
});

總結(jié):

1. 對于String或Integer這些已經(jīng)實現(xiàn)Comparable接口的類來說,可以直接使用Collections.sort方法傳入list參數(shù)來實現(xiàn)默認方式(正序)排序;
2.對于自定義類型(如本例子中的Emp),如果想使用Collections.sort的方式一進行排序,可以通過實現(xiàn)Comparable接口的compareTo方法來使用?;蛘呤褂玫诙N方式完成排序

2. 使用TreeSet給List去重

private List<DeviceServiceLog> removeDuplicateRecord(List<DeviceServiceLog> deviceServiceLogList) {
    Set<DeviceServiceLog> set = new TreeSet<>(new Comparator<DeviceServiceLog>() {

        @Override
        public int compare(DeviceServiceLog o1, DeviceServiceLog o2) {
            return o1.getServiceCode().compareTo(o2.getServiceCode());
        }

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

2.1 TreeSet構(gòu)造去重的兩種方式

1. 
public TreeSet(Collection<? extends E> c) {
    this();
    addAll(c);
}

2. 
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

2.2 兩種用法的區(qū)別及示例

解析:
TreeSet中的數(shù)據(jù)是有序不重復的,利用TreeSet可以給List對象進行去重及排序操作。
上面例子,是根據(jù)serviceCode的設備編碼去重及排序。

1. 對于普通類型,Integer,String直接調(diào)用第一種方式即可完成去重。
但如果是自定義類,第一種方式就必須在對應的類中實現(xiàn)hashCode及equals方法,TreeSet就知道如何區(qū)分兩個對象屬于同一個對象。
如果還想實現(xiàn)自定義排序,則再實現(xiàn)CompareTo方法。

2. 第二種方式,使用匿名內(nèi)部類,實現(xiàn)Comparable接口的compareTo接口完成去重,compareTo中如果返回0代表相同。
示例中就使用此方法根據(jù)實體類的某一字段實現(xiàn)的去重,如果要根據(jù)多個字段去重的話,使用該方式或使用自定義類重寫hashCode與equals方法會都可以。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容