List集合排序的实现

list集合排序的实现

根据对象属性进行排序
简单说明一下:对list集合中的User进行排序,根据其姓名和年龄进行排序。直接看代码,User类我就不写了

public class ListSort {

    public static void main(String[] args) {

        List<User> list = new ArrayList<>();

        list.add(new  User("zs", 24));
        list.add(new  User("ls", 26));
        list.add(new  User("ww", 20));
        list.add(new  User("jq", 25));
        list.add(new  User("hx", 19));
        list.add(new  User("ax", 19));

        System.out.println("排序前 " + list.toString());

        Collections.sort(list);
        System.out.println("排序后: " + list.toString());

    }

}

这种方法需要User类实现Comparable接口,并实现compareTo()方法,并在此方法内定义排序规则。

 //定义排序规则 根据年龄进行排序(从大到小),从小到大只需将this.getAge()和o.getAge()调换位置即可
    @Override
    public int compareTo(User o) {
        return o.getAge() - this.getAge();
    }

如果先要按照年龄排序,然后按照姓名排序,则写法如下:

 //定义排序规则  这里是先比较年龄再比较姓名
    @Override
    public int compareTo(User o) {
        int i = o.getAge() - this.getAge();
        if (i == 0) {
            i = o.getName().compareTo(this.getName());
        }
        return i;
    }

简要说明:i是int类型的返回值,1表示大于,0表示等于,-1表示小于。
打印结果如下:

在这里插入图片描述

这种写法总归还是麻烦,非要User实现Comparable接口,不太灵活。于是,有了下面的排序方法,这也是JDK1.8的新特性之一。

Lambda表达式

 list.sort(((o1, o2) -> {
            int i = o1.getAge() - o2.getAge();			//光标调到i的位置
            return i;            
        }));
        System.out.println("排序后: " + list.toString());

可以看出,这时候User不需要实现Comparable接口了。取而代之的是,把排序规则写到了Lambda里面。
其实在此基础上还可以进一步简化写法,操作很简单。把鼠标光标调到i的位置,然后一直alt + enter 再回车,就行了,最后会变成如下写法:

list.sort((Comparator.comparingInt(User::getAge)).thenComparing(User::getName));

这样是不是更简洁了呢。不过这样似乎没法倒序排序了,具体实现LZ这里还没有去研究,有兴趣的朋友可以去试试。

猜你喜欢

转载自blog.csdn.net/qq_42815754/article/details/84062173