zoukankan      html  css  js  c++  java
  • List集合排序的方法

    1、list集合中的对象实现Comparable接口

    public class User implements Comparable<User>{

    private Integer id;
    /**
      * 用户名
      */
    private String userName;

    /**
      * 年龄
      */
    private Integer age;

    @Override
    public int compareTo(User o) {
         // TODO Auto-generated method stub
         return this.age-o.age;
    }

    }

    测试类实现list按照实体类的age字段排序


    public static void main(String[] args) {
             List<User> list = Lists.newArrayList();
             User user1 = new User(23);
             User user2 = new User(2);
             User user3 = new User(43);
             list.add(user1);
             list.add(user2);
             list.add(user3);
             Collections.sort(list);
             for (User user : list) {
                 System.out.println(user.getAge());
             }


    }

    打印结果为

    2
    23
    43

    还可以根据lsit集合中的对象的某个字段获取最大值和最小值,通过Collections.min()和Collections.max()方法

    public static void main(String[] args) {
             List<User> list = Lists.newArrayList();
             User user1 = new User(23);
             User user2 = new User(2);
             User user3 = new User(43);
             list.add(user1);
             list.add(user2);
             list.add(user3);
             for (User user : list) {
                 System.out.println(Collections.min(list).getAge())
             }


    }

    打印结果为

    2

    2、通过匿名内部类来进行比较排序

    public static void main(String[] args) {

             List<Member> mList = Lists.newArrayList();
             Member member1 = new Member("李鸿章",4);
             Member member2 = new Member("张志红",2);
             Member member3 = new Member("张会生",3);
             mList.add(member1);
             mList.add(member3);
             mList.add(member2);
             //1、用Comparator匿名内部类来进行排序
             Collections.sort(mList, new Comparator<Member>() {
                 @Override
                 public int compare(Member o1, Member o2) {
                     return o1.getAge()-o2.getAge();
                 }
                
             });
             for (Member member : mList) {
                 System.out.println(member.getAge()+"---"+member.getNickname());
             }

    }

    此处为但条件排序,根据年龄进行排序,结果为

    2---张志红
    3---张会生
    4---李鸿章

    也可以按照多条件来排序,先按名称首字母排序,相同再按年龄排序

    public static void main(String[] args) {
          List<Member> mList = Lists.newArrayList();
             Member member1 = new Member("李鸿章",4);
             Member member2 = new Member("张志红",2);
             Member member3 = new Member("张会生",3);
             mList.add(member1);
             mList.add(member3);
             mList.add(member2);
             //多条件排序
             Collections.sort(mList, new Comparator<Member>() {
                 @Override
                 public int compare(Member o1, Member o2) {
                     int rs=0;
                     int a = o1.getNickname().compareTo(o2.getNickname());
                     if(a!=0) {
                         rs= a>0?-1:2;
                     }else {
                         a=o1.getAge().compareTo(o2.getAge());
                         rs= a>0?1:-1;
                     }
                     return rs;
                 }
                
             });
             for (Member member : mList) {
                 System.out.println(member.getAge()+"---"+member.getNickname());
             }
         }

    打印结果为

    4---李鸿章
    2---张志红
    3---张会生

    3、jdk1.8开始引入了lambda表达式,可以用来替换匿名内部类

    Lambda表达式的语法
    基本语法:
    (parameters) -> expression

    (parameters) ->{ statements; }

    下面是Java lambda表达式的简单例子:

    // 1. 不需要参数,返回值为 5  
    () -> 5  
      
    // 2. 接收一个参数(数字类型),返回其2倍的值  
    x -> 2 * x  
      
    // 3. 接受2个参数(数字),并返回他们的差值  
    (x, y) -> x – y  
      
    // 4. 接收2个int型整数,返回他们的和  
    (int x, int y) -> x + y  
      
    // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
    (String s) -> System.out.print(s) 

    所以上面通过匿名内部类对List排序的方法就可以改写成下面的

    Collections.sort(mList,(Member m1, Member m2) ->m1.getAge().compareTo(m2.getAge()));

  • 相关阅读:
    My Tornado Particle Effect
    [zz] 海洋环境的光能传递
    一道算法题
    Alembic
    一些莫名其妙的东东
    Python Q&A
    <<Exceptional C++>> notes
    CG Rendering v.s. Browser Rendering
    Modo
    Katana
  • 原文地址:https://www.cnblogs.com/liaopeng/p/8392654.html
Copyright © 2011-2022 走看看