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)
解決方案
寫一個(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)文章
SpringBoot集成LiteFlow工作流引擎的完整指南
LiteFlow作為一款國(guó)產(chǎn)輕量級(jí)規(guī)則引擎/流程引擎,以其零學(xué)習(xí)成本、高可擴(kuò)展性和極致性能成為微服務(wù)架構(gòu)下的理想選擇,本文將詳細(xì)講解SpringBoot集成LiteFlow的全過(guò)程,助大家輕松駕馭輕量級(jí)流程編排2025-06-06
詳解Spring Boot實(shí)戰(zhàn)之Rest接口開發(fā)及數(shù)據(jù)庫(kù)基本操作
本篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之Rest接口開發(fā)及數(shù)據(jù)庫(kù)基本操作,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
Spring Boot中RedisTemplate的使用示例詳解
RedisTemplate.opsForHash()是RedisTemplate類提供的用于操作Hash類型的方法,它可以用于對(duì)Redis中的Hash數(shù)據(jù)結(jié)構(gòu)進(jìn)行各種操作,如設(shè)置字段值、獲取字段值、刪除字段值等,本文介紹Spring Boot中RedisTemplate的使用,感興趣的朋友一起看看吧2023-10-10
windows定時(shí)器配置執(zhí)行java jar文件的方法詳解
這篇文章主要給大家介紹了關(guān)于windows定時(shí)器配置執(zhí)行java jar文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java編程中的vector類用法學(xué)習(xí)筆記
Vector通常被用來(lái)實(shí)現(xiàn)動(dòng)態(tài)數(shù)組,即可實(shí)現(xiàn)自動(dòng)增長(zhǎng)的對(duì)象數(shù)組,和C++一樣vector類同樣被Java內(nèi)置,下面就來(lái)看一下vector類的基本用法.2016-05-05
maven-surefire-plugin總結(jié)示例詳解
這篇文章主要介紹了maven-surefire-plugin總結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Java中將String轉(zhuǎn)換為int的多種方法
字符串轉(zhuǎn)換為整數(shù)是一個(gè)常見需求,本文主要介紹了Java中將String轉(zhuǎn)換為int的多種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
springboot 按月分表的實(shí)現(xiàn)方式
本文主要介紹了springboot 按月分表的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
SpringBoot 編程式事務(wù)使用及兩種實(shí)現(xiàn)方式
編程式事務(wù)管理是通過(guò)編寫代碼來(lái)管理事務(wù),相對(duì)于聲明式事務(wù)(@Transactional注解),它提供了更細(xì)粒度的事務(wù)控制,這篇文章主要介紹了SpringBoot 編程式事務(wù)使用及兩種實(shí)現(xiàn)方式,需要的朋友可以參考下2024-12-12

