@Author Jacky Wang
日常積累衬吆,轉(zhuǎn)載請(qǐng)注明出處算芯,http://www.reibang.com/p/0cf21d08b78e
一. List集合排序
需求:根據(jù)List集合中商品對(duì)象的銷(xiāo)售狀態(tài)進(jìn)行排序,未支付的商品放在前面,已支付的放在后面
List<WXPrepayStockVO> appletShowGoodsInfo = appletGoodsInfoShow(stockVO);
// 根據(jù)銷(xiāo)售狀態(tài)排序,方便前臺(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是一個(gè)工具類(lèi),sort是其中的靜態(tài)方法,是用來(lái)對(duì)List類(lèi)型進(jìn)行排序的,它有兩種參數(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()默認(rèn)正序排序。上述兩種方式都支持排序,那兩者的區(qū)別在哪呢?
1. 兩種方式都支持默認(rèn)的正序排序,但對(duì)于普通類(lèi)型例如Integer,如果需要逆序排序,第一種方式就不能實(shí)現(xiàn)了。
此處用Integer演示第一種方式:
List<Integer> intList = Arrays.asList(2, 3, 1);
Collections.sort(intList);
PrintUtil.showList(intList);
打印結(jié)果為: 1,2,3
如果要實(shí)現(xiàn)逆序就得用第二種方式了:
Collections.sort(intList,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 返回值為int類(lèi)型耐量,大于0表示正序,小于0表示逆序
return o2-o1;
}
});
System.out.println("after sort:");
PrintUtil.showList(intList);
打印結(jié)果為: 3,2,1
2. 對(duì)于自定義類(lèi)的排序,兩種方式都可以實(shí)現(xiàn),不同的是第一種方式在實(shí)體類(lèi)中實(shí)現(xiàn)Comparable接口的CompareTo方法排序,第二種方式在sort方法中實(shí)現(xiàn)compareTo方法進(jìn)行排序迎卤。
以上述需求為例,以銷(xiāo)售狀態(tài)排序,CompareTo方法事實(shí)上比較的是Unicode碼的大小:
第一種方式實(shí)現(xiàn):(實(shí)體類(lèi)中實(shí)現(xiàn)Comparable接口)
public class WXPrepayStockVO implements Serializable,Comparable<WXPrepayStockVO> {
private static final long serialVersionUID = -4198487626404096752L;
private String mpName; // 商品單品名
private String mpPrice;// 單品銷(xiāo)售價(jià)
private String mpVipPrice;// 單品會(huì)員價(jià)
private Long qty;// 銷(xiāo)售數(shù)量
private String saleStatus;// 銷(xiāo)售狀態(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) {
//按銷(xiāo)售狀態(tài)正序排序
return this.getSaleStatus().compareTo(o.getSaleStatus());
// 按銷(xiāo)售狀態(tài)逆序排序
// return o.getSaleStatus().compareTo(this.getSaleStatus());
}
}
則在使用時(shí)直接調(diào)用:Collections.sort(list);排序即可玷坠。
第二種方式實(shí)現(xiàn):
List<WXPrepayStockVO> appletShowGoodsInfo = appletGoodsInfoShow(stockVO);
// 根據(jù)銷(xiāo)售狀態(tài)排序蜗搔,方便前臺(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. 對(duì)于String或Integer這些已經(jīng)實(shí)現(xiàn)Comparable接口的類(lèi)來(lái)說(shuō),可以直接使用Collections.sort方法傳入list參數(shù)來(lái)實(shí)現(xiàn)默認(rèn)方式(正序)排序八堡;
2.對(duì)于自定義類(lèi)型(如本例子中的Emp)樟凄,如果想使用Collections.sort的方式一進(jìn)行排序,可以通過(guò)實(shí)現(xiàn)Comparable接口的compareTo方法來(lái)使用兄渺》炝洌或者使用第二種方式完成排序
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ù)是有序不重復(fù)的,利用TreeSet可以給List對(duì)象進(jìn)行去重及排序操作。
上面例子挂谍,是根據(jù)serviceCode的設(shè)備編碼去重及排序叔壤。
1. 對(duì)于普通類(lèi)型,Integer,String直接調(diào)用第一種方式即可完成去重。
但如果是自定義類(lèi),第一種方式就必須在對(duì)應(yīng)的類(lèi)中實(shí)現(xiàn)hashCode及equals方法,TreeSet就知道如何區(qū)分兩個(gè)對(duì)象屬于同一個(gè)對(duì)象口叙。
如果還想實(shí)現(xiàn)自定義排序,則再實(shí)現(xiàn)CompareTo方法炼绘。
2. 第二種方式,使用匿名內(nèi)部類(lèi),實(shí)現(xiàn)Comparable接口的compareTo接口完成去重,compareTo中如果返回0代表相同。
示例中就使用此方法根據(jù)實(shí)體類(lèi)的某一字段實(shí)現(xiàn)的去重,如果要根據(jù)多個(gè)字段去重的話(huà),使用該方式或使用自定義類(lèi)重寫(xiě)hashCode與equals方法會(huì)都可以妄田。