Java對(duì)象集合按照指定元素順序排序的實(shí)現(xiàn)
需求背景
最近在對(duì)一個(gè)集合列表的數(shù)據(jù)進(jìn)行排序,需求是要集合數(shù)據(jù)按照一個(gè)排序狀態(tài)值進(jìn)行排序,而這個(gè)狀態(tài)值,不是按照從小到大這樣的順序排序的,而是要按照特定的順序,比如按照1, 0, 2
的順序排的,所以需要自定義一個(gè)排序工具類來實(shí)現(xiàn)
解決方案
寫一個(gè)排序工具類
package cn.nzp.ems.ecb.server.business.screen; import java.io.Serializable; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class CustomizeNumComparator implements Comparator<Integer>, Serializable { private static final long serialVersionUID = 6076418974912880405L; List<Integer> numList = Stream.of(1, 0, 2).collect(Collectors.toList()); @Override public int compare(Integer o1, Integer o2) { int i1 = numList.indexOf(o1); int i2 = numList.indexOf(o2); return (i1 == -1 || i2 == -1) ? (i2 - i1) : i1 - i2; } }
測(cè)試一下排序
@Test public void testCompare() { List<RecordDto> list = Lists.newArrayList(); RecordDto record01= new RecordDto(); record01.setOrderNum(2); record01.setSName("測(cè)試名稱1"); RecordDto record02= new RecordDto(); record02.setOrderNum(0); record02.setSName("測(cè)試名稱2"); RecordDto record03 = new RecordDto(); record03.setOrderNum(1); record03.setSName("測(cè)試名稱3"); RecordDto record04= new RecordDto(); record04.setOrderNum(2); record04.setSName("測(cè)試名稱4"); RecordDto record05= new RecordDto (); record05.setOrderNum(0); record05.setSName("測(cè)試名稱5"); list.add(record01); list.add(record02); list.add(record03); list.add(record04); list.add(record05); list = list.stream() .sorted(Comparator.comparing(RecordDto::getOrderNum, new CustomizeNumComparator())) .collect(Collectors.toList()); list.stream().forEach(e -> { System.out.println(e.getName() +", " + e.getOrderNum()); }); }
跑一下測(cè)試結(jié)果
如果不想寫一個(gè)排序工具類,也可以創(chuàng)建一個(gè)Comparator
即可
public void testCompare() { List<Integer> numList = Stream.of(1, 0, 2).collect(Collectors.toList()); Comparator<RecordDto> comparingIndex = Comparator.comparing(record -> { final int index = numList.indexOf(record.getOrderNum()); return index == -1 ? Long.MAX_VALUE : index; }); list = list.stream() .sorted(comparingIndex.thenComparing(RecordDto::getCreateTime, Comparator.nullsLast(Date::compareTo))) .collect(Collectors.toList()); }
到此這篇關(guān)于Java對(duì)象集合按照指定元素順序排序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java指定元素順序排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何運(yùn)行SpringBoot項(xiàng)目的方法
這篇文章主要介紹了如何運(yùn)行SpringBoot項(xiàng)目的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器
這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Java設(shè)計(jì)模式之模板方法模式Template Method Pattern詳解
在我們實(shí)際開發(fā)中,如果一個(gè)方法極其復(fù)雜時(shí),如果我們將所有的邏輯寫在一個(gè)方法中,那維護(hù)起來就很困難,要替換某些步驟時(shí)都要重新寫,這樣代碼的擴(kuò)展性就很差,當(dāng)遇到這種情況就要考慮今天的主角——模板方法模式2022-11-11Java使用Tesseract-OCR實(shí)戰(zhàn)教程
本文介紹了如何在Java中使用Tesseract-OCR進(jìn)行文本提取,包括Tesseract-OCR的安裝、中文訓(xùn)練庫(kù)的配置、依賴庫(kù)的引入以及具體的代碼實(shí)現(xiàn),通過這個(gè)過程,我們將演示如何從視頻幀中提取文本2025-02-02如何獲取springboot打成jar后的classpath
這篇文章主要介紹了如何獲取springboot打成jar后的classpath問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07關(guān)于spring.factories的常用配置項(xiàng)說明
這篇文章主要介紹了關(guān)于spring.factories的常用配置項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07數(shù)據(jù)庫(kù)連接超時(shí)java處理的兩種方式
這篇文章主要介紹了數(shù)據(jù)庫(kù)連接超時(shí)java處理的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04