Java如何根据实体指定字段值对其List进行排序详解

 更新时间:2024年07月02日 09:56:08   作者:熙子XIZI  
在Java项目中可能会遇到给出一些条件,将List元素按照给定条件进行排序的情况,这篇文章主要给大家介绍了关于Java如何根据实体指定字段值对其List进行排序的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

本文记录在开发过程,如何使用Java对List中的实体指定的字段进行排序。

一、先准备个实体PO

public class Student {
    private String name;
    private String age;
    private String score;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getScore() {
        return score;
    }
    public void setScore(String score) {
        this.score = score;
    }
}

二、简易版本,利用比较器来实现排序

public class SortUtil {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student studentA = new Student();
        studentA.setName("a");
        studentA.setAge("16");
        studentA.setScore("95");
        Student studentB = new Student();
        studentB.setName("b");
        studentB.setAge("16");
        studentB.setScore("83");
        Student studentC = new Student();
        studentC.setName("c");
        studentC.setAge("16");
        studentC.setScore("90");

        students.add(studentA);
        students.add(studentB);
        students.add(studentC);

        System.out.println("-----排序前----");
        for (Student student : students) {
            System.out.println("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
        }
        System.out.println();


        //排序-------------比较器来实现排序
        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                BigDecimal data1 = new BigDecimal(o1.getScore());
                BigDecimal data2 = new BigDecimal(o2.getScore());
                return data2.compareTo(data1);
            }
        });
        //------------------------------

        System.out.println("-----排序后----");
        for (Student student : students) {
            System.out.println("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
        }

    }

测试结果:

三、封装成通用的方法类调用

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;

/**
 * @ClassName: SortUtil
 * @Author: XIZI
 * @Description: 排序
 */
public class SortUtil {
	private static Logger logger = Logger.getLogger(SortUtil.class);

    /**
     * 排序
     *
     * @param list      需要排序的list
     * @param filedName 字段名
     * @param ascFlag   是否升序
     * @param clazz     排序的类
     * @param <T>
     */
    public static <T> void sort(List<T> list, String filedName, boolean ascFlag, Class<T> clazz) {
        //通过比较器来实现排序
        list.sort(new Comparator<T>() {

            @Override
            public int compare(T o1, T o2) {
                String data1s = "";
                String data2s = "";

                Field[] fields = getAllFields(clazz);

                for (Field field : fields) {
                    // 设置字段可访问(必须,否则报错)
                    field.setAccessible(true);
                    if (field.getName().equals(filedName)) {
                        try {
                            data1s =  field.get(o1).toString();
                            data2s =  field.get(o2).toString();

                        } catch (IllegalAccessException e) {
                            logger.error("排序出现异常:", e);
                            return 0;
                        }
                        break;
                    }
                }
                BigDecimal data1 = new BigDecimal(data1s);
                BigDecimal data2 = new BigDecimal(data2s);
                if (ascFlag) {
                    //升序
                    return data1.compareTo(data2);
                } else {
                    //降序
                    return data2.compareTo(data1);
                }

            }
        });
    }

    public static Field[] getAllFields(Class<?> clazz){
        List<Field> fieldList = new ArrayList<>();
        while (clazz != null && !clazz.getName().toLowerCase().equals("java.lang.object")){
            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
            clazz = clazz.getSuperclass();
        }
        Field[] fields = new Field[fieldList.size()];
        return fieldList.toArray(fields);
    }
}

测试用例:

public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student studentA = new Student();
        studentA.setName("a");
        studentA.setAge("16");
        studentA.setScore("95");
        Student studentB = new Student();
        studentB.setName("b");
        studentB.setAge("16");
        studentB.setScore("83");
        Student studentC = new Student();
        studentC.setName("c");
        studentC.setAge("16");
        studentC.setScore("90");
        students.add(studentA);
        students.add(studentB);
        students.add(studentC);

        System.out.println("-----排序前----");
        for (Student student : students) {
            System.out.println("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
        }
        System.out.println();

		//调用排序方法执行降序
        SortUtil.sort(students, "score", false, Student.class);

        System.out.println("-----排序后----");
        for (Student student : students) {
            System.out.println("学生:" + student.getName() + "的分数为[" + student.getScore() + "]");
        }

    }

测试结果如预期一致。

附:指定条件排序

实现 List 排序有多种方法,本文总结以下几种。

调用 list sort 方法,实现比较器接口进行排序

package com.example.demo.help;

import java.util.*;

public class ListSortTest {
    public static void main(String[] args) {

        List<String> rules = new ArrayList<>();
        rules.add("30003");
        rules.add("20002");
        rules.add("10001");
        rules.add("40004");
        rules.add("60006");
        rules.add("50005");

        Map<String, Integer> ruleUpper = new HashMap<>();
        ruleUpper.put("10001", 1);
        ruleUpper.put("20002", 2);
        ruleUpper.put("30003", 3);
        ruleUpper.put("40004", 4);

        rules.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return ruleUpper.getOrDefault(o1, Integer.MAX_VALUE) - ruleUpper.getOrDefault(o2, Integer.MAX_VALUE);
            }
        });
        System.out.println(rules);
        // [10001, 20002, 30003, 40004, 60006, 50005]
    }
}

调用 list sort 方法,通过 lambda 表达式实现排序

package com.example.demo.help;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ListSortTest {
    public static void main(String[] args) {

        List<String> rules = new ArrayList<>();
        rules.add("30003");
        rules.add("20002");
        rules.add("10001");
        rules.add("40004");
        rules.add("60006");
        rules.add("50005");

        Map<String, Integer> ruleUpper = new HashMap<>();
        ruleUpper.put("10001", 1);
        ruleUpper.put("20002", 2);
        ruleUpper.put("30003", 3);
        ruleUpper.put("40004", 4);

        rules.sort((o1, o2) -> (ruleUpper.getOrDefault(o1, Integer.MAX_VALUE) - ruleUpper.getOrDefault(o2, Integer.MAX_VALUE)));
        System.out.println(rules);
        // [10001, 20002, 30003, 40004, 60006, 50005]
    }
}

通过 Collections sort 方法,实现比较器接口进行排序

package com.example.demo.help;

import java.util.*;

public class ListSortTest {
    public static void main(String[] args) {

        List<String> rules = new ArrayList<>();
        rules.add("30003");
        rules.add("20002");
        rules.add("10001");
        rules.add("40004");
        rules.add("60006");
        rules.add("50005");

        Map<String, Integer> ruleUpper = new HashMap<>();
        ruleUpper.put("10001", 1);
        ruleUpper.put("20002", 2);
        ruleUpper.put("30003", 3);
        ruleUpper.put("40004", 4);

        Collections.sort(rules, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return ruleUpper.getOrDefault(o1, Integer.MAX_VALUE) - ruleUpper.getOrDefault(o2, Integer.MAX_VALUE);
            }
        });
        System.out.println(rules);
        // [10001, 20002, 30003, 40004, 60006, 50005]
    }
}

总结 

到此这篇关于Java如何根据实体指定字段值对其List进行排序的文章就介绍到这了,更多相关Java实体指定字段值对List排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot连接Nacos集群报400问题及完美解决方法

    SpringBoot连接Nacos集群报400问题及完美解决方法

    这篇文章主要介绍了解决SpringBoot连接Nacos集群报400问题 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Hikari连接池使用SpringBoot配置JMX监控实现

    Hikari连接池使用SpringBoot配置JMX监控实现

    Hikari是Spring Boot默认的数据库连接池。区别于C3P0直接通过连接池对象获取各项状态指标,Hikari需要通过JMX来获取。本文就详细的来介绍一下,感兴趣的可以了解一下
    2021-07-07
  • Java学习之如何进行JSON解析

    Java学习之如何进行JSON解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它算是JavaScript语言的一部分,与XML一样都可以用于数据的存储和传输,本文讲给大家介绍如何进行JSON解析,需要的朋友可以参考下
    2023-12-12
  • Java并发编程中构建自定义同步工具

    Java并发编程中构建自定义同步工具

    这篇文章主要介绍了Java并发编程中构建自定义同步工具,本文讲解了可阻塞状态依赖操作的结构、有界缓存实现基类示例、阻塞实现方式一:抛异常给调用者、阻塞实现方式二:通过轮询和休眠、阻塞实现方式三:条件队列等内容,需要的朋友可以参考下
    2015-04-04
  • 解决MyEclipse中Maven设置jdk版本jdk1.8报错问题

    解决MyEclipse中Maven设置jdk版本jdk1.8报错问题

    今天安装了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一个maven项目,项目默认是jdk1.5,改成jdk1.8后项目报错
    2018-10-10
  • Spring中缓存注解@Cache的使用详解

    Spring中缓存注解@Cache的使用详解

    这篇文章主要介绍了Spring中缓存注解@Cache的使用详解,使用注解对数据进行缓存功能的框架,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码,需要的朋友可以参考下
    2023-07-07
  • SpringKafka错误处理(重试机制与死信队列)

    SpringKafka错误处理(重试机制与死信队列)

    Spring Kafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Spring Bean装载方式代码实例解析

    Spring Bean装载方式代码实例解析

    这篇文章主要介绍了Spring Bean装载方式代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java设计模式之观察者模式(Observer模式)

    Java设计模式之观察者模式(Observer模式)

    这篇文章主要介绍了Java设计模式之观察者模式(Observer模式),文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Spring boot 配置多个redis的方法示例

    Spring boot 配置多个redis的方法示例

    这篇文章主要介绍了Spring boot 配置多个redis的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论