List資料多重規則排序

執筆記憶的空白發表於2017-05-03

List集合進行排序時,很多人會考慮 冒泡、快速等排序演算法,但是對於多重排序規則的話,演算法就不太適用了。其實java.util.Collections已經提供了 sort的排序方法,並且能自己實現其排序規則。

現在有個場景:我需要對一批優惠券進行排序, 優惠券有三個屬性: 是否可用、券型別 、面額。   我需要將可用的、券型別最大的、面額最大的券排到最前面。

即優先按 是否可用排序,其次是券型別,再者就是面額。    

話不都說,看程式碼吧:

package com.test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;


/**
 * List多重規則排序測試類
 * @author : shijing
 * 2017年5月3日上午11:00:51
 */
public class TestCompartor {
    public static void main(String[] args) {

        ArrayList<Coupon> persons = new ArrayList<Coupon>();
        persons.add(new Coupon(13,0,new BigDecimal(40)));
        persons.add(new Coupon(13,0,new BigDecimal(50)));
        persons.add(new Coupon(13,0,new BigDecimal(45)));
        persons.add(new Coupon(1,0,new BigDecimal(20)));
        persons.add(new Coupon(13,1,new BigDecimal(30)));
        persons.add(new Coupon(1,0,new BigDecimal(25)));
        persons.add(new Coupon(11,0,new BigDecimal(50)));
        persons.add(new Coupon(11,1,new BigDecimal(40)));
        System.out.println("排序之前:");
        for (int i = 0; i <persons.size(); i++) {
            System.out.println(persons.get(i));
        }
        System.out.println();
        Collections.sort(persons, new Comparator<Coupon>() {
            //按可用升序,券型別降序,面額降序
            public int compare(Coupon o1, Coupon o2) {
                if (o1.valueAble.compareTo(o2.valueAble)==0){
                	if(o2.themeType.compareTo(o1.themeType)==0){
                		return o2.amount.compareTo(o1.amount)>0?1:-1;
                	}else{
                		return o2.themeType - o1.themeType;
                	}
                }else{
                    return o1.valueAble-o2.valueAble ;
                }
            }
        });
        System.out.println("排序後結果:");
        for (int i = 0; i <persons.size(); i++) {
            System.out.println(persons.get(i));
        }
    }
    
    
    static class Coupon{
        public Integer themeType;  //優惠券型別
        public Integer valueAble; //可用  ,0 可用,1不可用
        public BigDecimal amount;  //面額

        @Override
        public String toString() {
            return "Person{" +
                    "themeType=" + themeType +
                    ", valueAble=" + valueAble +
                    ", amount=" + amount +
                    '}';
        }

		public Coupon(Integer themeType, Integer valueAble, BigDecimal amount) {
			super();
			this.themeType = themeType;
			this.valueAble = valueAble;
			this.amount = amount;
		}
        
    }
}

至於封裝工具類我就懶得弄了,有需要的自己封裝吧。


相關文章