@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方法會都可以。