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()));

posted @ 2018-01-31 15:44  夏夜弥光  阅读(563)  评论(0编辑  收藏  举报