Java对象集合按照指定元素顺序排序的实现

 更新时间:2024年07月02日 11:52:18   作者:smileNicky  
最近在对一个集合列表的数据进行排序,需求是要集合数据按照一个排序状态值进行排序,而这个状态值,不是按照从小到大这样的顺序排序的,而是要按照特定的顺序,所以本文给大家介绍了Java对象集合按照指定元素顺序排序的实现,需要的朋友可以参考下

需求背景

最近在对一个集合列表的数据进行排序,需求是要集合数据按照一个排序状态值进行排序,而这个状态值,不是按照从小到大这样的顺序排序的,而是要按照特定的顺序,比如按照1, 0, 2的顺序排的,所以需要自定义一个排序工具类来实现

解决方案

写一个排序工具类

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;
    }
}

测试一下排序

@Test
public void testCompare() {
	List<RecordDto> list = Lists.newArrayList();
	RecordDto record01= new RecordDto();
	record01.setOrderNum(2);
	record01.setSName("测试名称1");

	RecordDto record02= new RecordDto();
	record02.setOrderNum(0);
	record02.setSName("测试名称2");

	RecordDto record03 = new RecordDto();
	record03.setOrderNum(1);
	record03.setSName("测试名称3");

	RecordDto record04= new RecordDto();
	record04.setOrderNum(2);
	record04.setSName("测试名称4");

	RecordDto record05= new RecordDto ();
	record05.setOrderNum(0);
	record05.setSName("测试名称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());
	});
}

跑一下测试结果

如果不想写一个排序工具类,也可以创建一个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());
}

到此这篇关于Java对象集合按照指定元素顺序排序的实现的文章就介绍到这了,更多相关Java指定元素顺序排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 流式图表拒绝增删改查之框架搭建过程

    流式图表拒绝增删改查之框架搭建过程

    这篇文章主要为大家介绍了流式图表拒绝增删改查之框架搭建过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 如何运行SpringBoot项目的方法

    如何运行SpringBoot项目的方法

    这篇文章主要介绍了如何运行SpringBoot项目的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java设计模式之java迭代器模式详解

    Java设计模式之java迭代器模式详解

    这篇文章主要介绍了java迭代器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09
  • JDK动态代理提高代码可维护性和复用性利器

    JDK动态代理提高代码可维护性和复用性利器

    这篇文章主要为大家介绍了JDK动态代理提高代码可维护性和复用性利器,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java设计模式之模板方法模式Template Method Pattern详解

    Java设计模式之模板方法模式Template Method Pattern详解

    在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角——模板方法模式
    2022-11-11
  • Java使用Tesseract-OCR实战教程

    Java使用Tesseract-OCR实战教程

    本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代码实现,通过这个过程,我们将演示如何从视频帧中提取文本
    2025-02-02
  • 如何获取springboot打成jar后的classpath

    如何获取springboot打成jar后的classpath

    这篇文章主要介绍了如何获取springboot打成jar后的classpath问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 关于spring.factories的常用配置项说明

    关于spring.factories的常用配置项说明

    这篇文章主要介绍了关于spring.factories的常用配置项说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 数据库连接超时java处理的两种方式

    数据库连接超时java处理的两种方式

    这篇文章主要介绍了数据库连接超时java处理的两种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring Boot之过滤器 Filter注入的方式解析

    Spring Boot之过滤器 Filter注入的方式解析

    这篇文章主要介绍了Spring Boot之过滤器 Filter注入的方式解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论