最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何根據(jù)實(shí)體指定字段值對其List進(jìn)行排序詳解

 更新時(shí)間:2024年07月02日 09:56:08   作者:熙子XIZI  
在Java項(xiàng)目中可能會(huì)遇到給出一些條件,將List元素按照給定條件進(jìn)行排序的情況,這篇文章主要給大家介紹了關(guān)于Java如何根據(jù)實(shí)體指定字段值對其List進(jìn)行排序的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

本文記錄在開發(fā)過程,如何使用Java對List中的實(shí)體指定的字段進(jìn)行排序。

一、先準(zhǔn)備個(gè)實(shí)體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;
    }
}

二、簡易版本,利用比較器來實(shí)現(xiàn)排序

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("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]");
        }
        System.out.println();


        //排序-------------比較器來實(shí)現(xiàn)排序
        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("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]");
        }

    }

測試結(jié)果:

三、封裝成通用的方法類調(diào)用

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) {
        //通過比較器來實(shí)現(xiàn)排序
        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) {
                    // 設(shè)置字段可訪問(必須,否則報(bào)錯(cuò))
                    field.setAccessible(true);
                    if (field.getName().equals(filedName)) {
                        try {
                            data1s =  field.get(o1).toString();
                            data2s =  field.get(o2).toString();

                        } catch (IllegalAccessException e) {
                            logger.error("排序出現(xiàn)異常:", 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("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]");
        }
        System.out.println();

		//調(diào)用排序方法執(zhí)行降序
        SortUtil.sort(students, "score", false, Student.class);

        System.out.println("-----排序后----");
        for (Student student : students) {
            System.out.println("學(xué)生:" + student.getName() + "的分?jǐn)?shù)為[" + student.getScore() + "]");
        }

    }

測試結(jié)果如預(yù)期一致。

附:指定條件排序

實(shí)現(xiàn) List 排序有多種方法,本文總結(jié)以下幾種。

調(diào)用 list sort 方法,實(shí)現(xiàn)比較器接口進(jìn)行排序

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

調(diào)用 list sort 方法,通過 lambda 表達(dá)式實(shí)現(xiàn)排序

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 方法,實(shí)現(xiàn)比較器接口進(jìn)行排序

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

總結(jié) 

到此這篇關(guān)于Java如何根據(jù)實(shí)體指定字段值對其List進(jìn)行排序的文章就介紹到這了,更多相關(guān)Java實(shí)體指定字段值對List排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java泛型映射不同的值類型詳解及實(shí)例代碼

    Java泛型映射不同的值類型詳解及實(shí)例代碼

    這篇文章主要介紹了Java泛型映射不同的值類型詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java使用jasypt配置文件加密方式

    Java使用jasypt配置文件加密方式

    本文介紹了使用POM文件引入加密插件對配置文件內(nèi)容進(jìn)行加密的方法,將加密內(nèi)容替換為ENC()格式,項(xiàng)目啟動(dòng)時(shí)自動(dòng)解密;并提供了一種動(dòng)態(tài)密鑰的方法,避免每個(gè)項(xiàng)目單獨(dú)寫加解密程序
    2026-05-05
  • 解析SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù)的問題

    解析SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù)的問題

    Minio是Apache?License?v2.0下發(fā)布的對象存儲(chǔ)服務(wù)器,使用MinIO構(gòu)建用于機(jī)器學(xué)習(xí),分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載的高性能基礎(chǔ)架構(gòu)。這篇文章主要介紹了SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù),需要的朋友可以參考下
    2022-03-03
  • Java 動(dòng)態(tài)生成類和實(shí)例, 并注入方法操作示例

    Java 動(dòng)態(tài)生成類和實(shí)例, 并注入方法操作示例

    這篇文章主要介紹了Java 動(dòng)態(tài)生成類和實(shí)例, 并注入方法操作,結(jié)合實(shí)例形式分析了Java 動(dòng)態(tài)生成類和實(shí)例以及動(dòng)態(tài)注入相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • Java 棧與隊(duì)列超詳細(xì)分析講解

    Java 棧與隊(duì)列超詳細(xì)分析講解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,在Java的時(shí)候,對于棧與隊(duì)列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。本文小編就來詳細(xì)說說Java中的棧與隊(duì)列,需要的朋友可以參考一下
    2022-04-04
  • Java多線程中的CountDownLatch解析

    Java多線程中的CountDownLatch解析

    這篇文章主要介紹了Java多線程中的CountDownLatch解析,CountDownLatch是一個(gè)阻塞部分線程直到其他線程執(zhí)行完成后喚醒的同步計(jì)數(shù)器,核心是其內(nèi)部類Sync繼承于AQS,同時(shí)也是利用的AQS的同步原理,也稱之為閉鎖,需要的朋友可以參考下
    2023-11-11
  • Spring簡明分析Bean作用域

    Spring簡明分析Bean作用域

    scope用來聲明容器中的對象所應(yīng)該處的限定場景或者說該對象的存活時(shí)間,即容器在對象進(jìn)入其 相應(yīng)的scope之前,生成并裝配這些對象,在該對象不再處于這些scope的限定之后,容器通常會(huì)銷毀這些對象,這篇文章主要介紹了Spring中的Bean作用域,需要的朋友可以參考下
    2022-07-07
  • Java緩存Map設(shè)置過期時(shí)間實(shí)現(xiàn)解析

    Java緩存Map設(shè)置過期時(shí)間實(shí)現(xiàn)解析

    這篇文章主要介紹了Java緩存Map設(shè)置過期時(shí)間實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決

    java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決

    這篇文章主要介紹了java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 如何手寫一個(gè)Spring Boot Starter

    如何手寫一個(gè)Spring Boot Starter

    這篇文章主要介紹了如何手寫一個(gè)Spring Boot Starter,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03

最新評論

通化县| 双辽市| 建始县| 玉环县| 凭祥市| 沂水县| 大关县| 枞阳县| 樟树市| 遂宁市| 湘潭县| 襄樊市| 修武县| 栾川县| 成武县| 闸北区| 安泽县| 肥乡县| 阿合奇县| 南汇区| 冀州市| 宁晋县| 独山县| 衡东县| 逊克县| 白朗县| 新龙县| 仙游县| 怀柔区| 两当县| 丁青县| 巴彦淖尔市| 孟连| 甘洛县| 吉安县| 延长县| 巴中市| 石林| 荆州市| 陆良县| 凌海市|