最近有個需求,要求對購物車的商品進行排序。且同一活動的商品,要在一起顯示。
最初想到的辦法是首先對商品按活動進行分組,再進行組內排序。
發現這麼做有點麻煩且性能比較低,經過leader提醒,可以先按活動排序,這樣自然就按活動分組了。
而且jdk有自帶的對集合排序的算法,廢話不多說,直接上代碼:
/**
* 1、根據活動排序
* 2、根據商品類型(普通商品、贈品、組合銷售從商品)排序
* 3、按商品編號排序
* 4、按加入購物車的時間排序
* @param productColumnVolist
* @return
*/
private List<ProductColumnVo> productColumnSort(List<ProductColumnVo> productColumnVolist){
Collections.sort(productColumnVolist, new Comparator<ProductColumnVo>() {
public int compare(ProductColumnVo o1, ProductColumnVo o2) {
if(StringUtils.isNotBlank(o1.getActiveID())
&& StringUtils.isBlank(o2.getActiveID())){
//有活動的在前面顯示
return -1;
}else if(StringUtils.isBlank(o1.getActiveID())
&& StringUtils.isNotBlank(o2.getActiveID())){
return 1;
}else if(StringUtils.isNotBlank(o1.getActiveID())
&& StringUtils.isNotBlank(o2.getActiveID())){
//按活動排序
int activeCompareResult = o1.getActiveID().compareTo(o2.getActiveID());
if(activeCompareResult != 0){
return activeCompareResult;
}
}
//根據商品類型(普通商品、贈品、組合銷售從商品)
int productTypeCompareResult = o1.getProductType() - o2.getProductType();
if(productTypeCompareResult == 0){
//按商品編號排序
int commodityTypeCompareResult = o1.getCommodityNo().compareTo(o2.getCommodityNo());
if(commodityTypeCompareResult == 0){
//按加入購物車的時間排序
return (o1.getAddDate().before(o2.getAddDate()) ? -1:1);
}else{
return commodityTypeCompareResult;
}
}else{
return productTypeCompareResult;
}
}
});
return productColumnVolist;
}
夠簡單吧。
其中組合銷售的主商品的productType是0,從商品的productType是3。贈品活動主商品的productType是0,贈品時1。
注意:compare(a,b)方法:根據第一個參數小於、等於或大於第二個參數分別返回負整數、零或正整數。如果大於0,則調整順序,否則按原來順序。
順便研究了下Collections.sort的實現,這是一個穩定的排序。如果集合的長度小於7,就按直接插入進行排序,其余則按歸並排序。