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è)排序工具類來(lái)實(shí)現(xiàn)
解決方案
寫(xiě)一個(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é)果

如果不想寫(xiě)一個(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)目的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器
這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Java設(shè)計(jì)模式之模板方法模式Template Method Pattern詳解
在我們實(shí)際開(kāi)發(fā)中,如果一個(gè)方法極其復(fù)雜時(shí),如果我們將所有的邏輯寫(xiě)在一個(gè)方法中,那維護(hù)起來(lái)就很困難,要替換某些步驟時(shí)都要重新寫(xiě),這樣代碼的擴(kuò)展性就很差,當(dāng)遇到這種情況就要考慮今天的主角——模板方法模式2022-11-11
Java使用Tesseract-OCR實(shí)戰(zhàn)教程
本文介紹了如何在Java中使用Tesseract-OCR進(jìn)行文本提取,包括Tesseract-OCR的安裝、中文訓(xùn)練庫(kù)的配置、依賴庫(kù)的引入以及具體的代碼實(shí)現(xiàn),通過(guò)這個(gè)過(guò)程,我們將演示如何從視頻幀中提取文本2025-02-02
如何獲取springboot打成jar后的classpath
這篇文章主要介紹了如何獲取springboot打成jar后的classpath問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
關(guān)于spring.factories的常用配置項(xiàng)說(shuō)明
這篇文章主要介紹了關(guān)于spring.factories的常用配置項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
數(shù)據(jù)庫(kù)連接超時(shí)java處理的兩種方式
這篇文章主要介紹了數(shù)據(jù)庫(kù)連接超時(shí)java處理的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Spring Boot之過(guò)濾器 Filter注入的方式解析
這篇文章主要介紹了Spring Boot之過(guò)濾器 Filter注入的方式解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

