List集合中對(duì)數(shù)據(jù)實(shí)現(xiàn)多重規(guī)則進(jìn)行排序的案例
List集合進(jìn)行排序時(shí),很多人會(huì)考慮冒泡、快速等排序算法,但是對(duì)于多重排序規(guī)則的話,算法就不太適用了。其實(shí)java.util.Collections
已經(jīng)提供了sort
的排序方法,并且能自己實(shí)現(xiàn)其排序規(guī)則。
現(xiàn)在有個(gè)場(chǎng)景:我需要對(duì)一批優(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ī)則排序測(cè)試類 */ 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é)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- Java實(shí)現(xiàn)對(duì)兩個(gè)List快速去重并排序操作示例
- Java中對(duì)list map根據(jù)map某個(gè)key值進(jìn)行排序的方法
- Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法
- java中List對(duì)象列表實(shí)現(xiàn)去重或取出及排序的方法
- Java?Collections.sort()實(shí)現(xiàn)List排序的默認(rèn)方法和自定義方法
- java 中List按照date排序的實(shí)現(xiàn)
- Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法
- java ArrayList集合中的某個(gè)對(duì)象屬性進(jìn)行排序的實(shí)現(xiàn)代碼
- 用Java集合中的Collections.sort方法如何對(duì)list排序(兩種方法)
- Java中對(duì)list元素進(jìn)行排序的方法詳解
相關(guān)文章
Java Socket實(shí)現(xiàn)多人聊天系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java Socket實(shí)現(xiàn)多人聊天系統(tǒng),具有圖形界面,實(shí)現(xiàn)文件傳輸功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Java用POI導(dǎo)入導(dǎo)出Excel實(shí)例分析
在本篇文章里小編給大家整理的是一篇關(guān)于Java用POI導(dǎo)入導(dǎo)出Excel實(shí)例分析內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-11-11Java設(shè)計(jì)模式之命令模式(Command模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下2015-03-03Java?20在Windows11系統(tǒng)下的簡(jiǎn)易安裝教程
這篇文章主要給大家介紹了關(guān)于Java?20在Windows11系統(tǒng)下的簡(jiǎn)易安裝教程,學(xué)習(xí)Java的同學(xué),第一步就是安裝好Java環(huán)境,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07SpringMVC4.3?HttpMessageConverter接口實(shí)現(xiàn)源碼分析
這篇文章主要為大家介紹了SpringMVC4.3?HttpMessageConverter接口實(shí)現(xiàn)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類
這篇文章主要介紹了使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java Comparable及Comparator接口區(qū)別詳解
這篇文章主要介紹了Java Comparable及Comparator接口區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07