zoukankan      html  css  js  c++  java
  • 【Java】【11】List的几种排序写法

    前言:

    1,实现Comparator接口的类的对象作为sort的入参

    2,在方法的局部使用局部类

    3,基于第二种方法,局部类改为匿名类

    4,使用lamdba表达式->这种形式

    5,借助Comparator和lamdba表达式多条件排序

    6,调用方式和第五种有区别,原理一样

    注:我以前是常用第1种,看了代码之后,觉得5,6种好一些

    正文:

    目标:按年龄从小到大排序

    compareTo()方法:返回值为-1,第一个参数排前面;返回值为1,则第二个参数排前面;返回0按初始顺序排列

    Comparator.comparing可以构造相反的排序:Comparator.comparing,见方法5

    0,Java的实体bean结构

    import java.util.ArrayList;
    import java.util.List;
     
    public class Human {
        private String name;
        private int age;
     
        public Human() {
        }
     
        public Human(String name, int age) {
            this.name = name;
            this.age = age;
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public int getAge() {
            return age;
        }
     
        public void setAge(int age) {
            this.age = age;
        }
     
        @SuppressWarnings("serial")
        public static List<Human> getAInitHumanList() {
            return new ArrayList<Human>() {
                {
                    add(new Human("a", 12));
                    add(new Human("b", 10));
                    add(new Human("c", 12));
                    add(new Human("d", 28));
                }
            };
        }
     
        @Override
        public String toString() {
            return this.getName() + ":" + this.getAge();
        }
    }

    1,实现Comparator接口的类的对象作为sort的入参

    其实就是自己先定义一个比较的方法,一般是把这个方法写在实体类里面

    public class HumanComparetor implements Comparator<Human> {
        @Override
        public int compare(Human h1, Human h2) {
            if (h1.getAge() > h2.getAge()) {
                return 1;
            } else if (h1.getAge() == h2.getAge()) {
                return 0;
            } else {
                return -1;
            }
        }
    }

    调用

      public static void main(String[] args) {
            List<Human> humans = Human.getAInitHumanList();
            Collections.sort(humans, new HumanComparetor());
        }

    2,在方法的局部使用局部类

    这样的格式看着就不太想用

        public static void main(String[] args) {
            List<Human> humans = Human.getAInitHumanList();
            //方法内-局部类
            class HumanComparetor implements Comparator<Human> {
                @Override
                public int compare(Human h1, Human h2) {
                    return h1.getAge() - h2.getAge();
                }
            }
            Collections.sort(humans, new HumanComparetor());
        }

    3,基于第二种方法,局部类改为匿名类

    同上

        public static void main(String[] args) {
            List<Human> humans = Human.getAInitHumanList();
            //匿名类
            Collections.sort(humans, new Comparator<Human>() {
                @Override
                public int compare(Human h1, Human h2) {
                    return h1.getAge() - h2.getAge();
                }
            });
        }

    4,使用lamdba表达式->这种形式

        public static void main(String[] args) {
            List<Human> humans = Human.getAInitHumanList();
            //lamdba 表达式 ->
            Collections.sort(humans, (Human h1, Human h2) -> h1.getAge() - h2.getAge());
        }

    5,借助Comparator和lamdba表达式多条件排序

       public static void main(String[] args) {
            List<Human> humans = Human.getAInitHumanList();
            Collections.sort(humans, Comparator.comparing(Human::getAge).thenComparing(Human::getName));
            System.out.println(humans);
        }

     结果:[b:10, a:12, c:12, d:28]

    相反的排序

    public static void main(String[] args) {
            List<Human> humans = Human.getAInitHumanList();
            Collections.sort(humans, Comparator.comparing(Human::getAge).thenComparing(Human::getName).reversed());
          System.out.println(humans); 
    }

    结果:[d:28, c:12, a:12, b:10]

    6,调用方式和第五种有区别,原理一样

      public static void main(String[] args) {
            List<Human> humans = Human.getAInitHumanList();
            //直接用list.sort
            humans.sort(Comparator.comparing(Human::getAge).thenComparing(Human::getName));
        }

    参考博客:

    1,java的list的几种排序写法整理(sort的用法) - 赫双炎 - CSDN博客
    https://blog.csdn.net/heliangb46/article/details/77188939

    2,Java中Collections.sort()排序详解 - 薛瑄的博客 - CSDN博客
    https://blog.csdn.net/xx326664162/article/details/52227690/

    3,Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法 - 那些年的事儿 - 博客园
    https://www.cnblogs.com/nayitian/p/3322267.html

     4,java list按照 对象 指定多个字段属性进行排序 - 羽林.Luouy - 博客园

    https://www.cnblogs.com/Luouy/p/7159550.html

  • 相关阅读:
    20145212 《Java程序设计》第10周学习总结
    20145212 实验五《Java网络编程》
    20145212 《Java程序设计》第9周学习总结
    20145212 实验四《Andoid开发基础》
    《信息安全系统设计基础》第2周总结
    20145210《信息安全系统设计基础》第1周学习总结
    20145210 《信息安全系统设计基础》第0周学习总结
    20145210姚思羽_课程总结
    20145210实验五《Java网络编程》
    20145210 《Java程序设计》第十周学习总结
  • 原文地址:https://www.cnblogs.com/huashengweilong/p/10730615.html
Copyright © 2011-2022 走看看