溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

List集合中對數(shù)據(jù)實(shí)現(xiàn)多重規(guī)則進(jìn)行排序的案例

發(fā)布時(shí)間:2020-08-21 02:27:41 來源:腳本之家 閱讀:288 作者:執(zhí)筆記憶的空白 欄目:編程語言

List集合進(jìn)行排序時(shí),很多人會考慮冒泡、快速等排序算法,但是對于多重排序規(guī)則的話,算法就不太適用了。其實(shí)java.util.Collections已經(jīng)提供了sort的排序方法,并且能自己實(shí)現(xiàn)其排序規(guī)則。

現(xiàn)在有個(gè)場景:我需要對一批優(yōu)惠券進(jìn)行排序,優(yōu)惠券有三個(gè)屬性:是否可用、券類型、面額。我需要將可用的、券類型最大的、面額最大的券排到最前面。

即優(yōu)先按是否可用排序,其次是券類型,再者就是面額。    

話不多說,看代碼吧:

package com.test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
 * List多重規(guī)則排序測試類
 */
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("排序后結(jié)果:");
    for (int i = 0; i <persons.size(); i++) {
      System.out.println(persons.get(i));
    }
  }
  static class Coupon{
    public Integer themeType; //優(yōu)惠券類型
    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;
 }
  }
}

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

這里如果用了Integer等封裝類型,最好自己也做下非空處理。

排序之前:

Person{themeType=13, valueAble=0, amount=40} Person{themeType=13, valueAble=0, amount=50} Person{themeType=13, valueAble=0, amount=45} Person{themeType=1, valueAble=0, amount=20} Person{themeType=13, valueAble=1, amount=30} Person{themeType=1, valueAble=0, amount=25} Person{themeType=11, valueAble=0, amount=50} Person{themeType=11, valueAble=1, amount=40} 

排序后結(jié)果:

Person{themeType=13, valueAble=0, amount=50} Person{themeType=13, valueAble=0, amount=45} Person{themeType=13, valueAble=0, amount=40} Person{themeType=11, valueAble=0, amount=50} Person{themeType=1, valueAble=0, amount=25} Person{themeType=1, valueAble=0, amount=20} Person{themeType=13, valueAble=1, amount=30} Person{themeType=11, valueAble=1, amount=40}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對億速云的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI