实现Comparable接口

1,List中的如果是基本类型和String类型,可以直接使用Collections.sort(list)方法。

其实基本类型对应的包装类和String类型都实现了Compareable接口。

String a="2";
String b="3";
String c="1";
List<String> list=new ArrayList<>();
list.add(a);
list.add(b);
list.add(c);
Collections.sort(list);

2,如果是pojo实体类,需要实现Comparable接口。

User实体类实现Comparable接口

public class User implements Comparable<User>{
    private Integer id;
    private String name;
    private Date birthday;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", birthday=" + birthday +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public int compareTo(User o) {
        int result=0;
        if(this.getBirthday().before(o.getBirthday())){
            result=-1;
        }
        if(this.getBirthday().after(o.getBirthday())){
            result=1;
        }
        return result;
    }
}

然后可以使用Collections.sort()方法

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        List<User> userList=new ArrayList<User>();
        User u1 = new User();
        u1.setId(2);
        u1.setBirthday(dateFormat.parse("2019-01-10"));
        u1.setName("tom");

        User u2 = new User();
        u2.setId(3);
        u2.setBirthday(dateFormat.parse("2019-01-11"));
        u2.setName("jerry");

        User u3 = new User();
        u3.setId(1);
        u3.setBirthday(dateFormat.parse("2007-01-10"));
        u3.setName("jack");

        List<User> users=new ArrayList<User>();
        users.add(u1);
        users.add(u2);
        users.add(u3);
        Collections.sort(users);
        for (User user : users) {
            System.out.println(user);
        }
    }

 上面的方法都是采用实现Comparable接口,实现compareTo方法,然后,调用Collections.sort()方法进行排序。

 

外部比较器Comparator进行排序

当需要对集合的元素进行排序的时候,可以使用java.util.Comparator创建一个比较器来进行排序。Comparator接口同样也是一个函数式接口,可以使用lambda表达式。

//方法一
users.sort((o1,o2)->o1.getBirthday().compareTo(o2.getBirthday()));
//方法二
Collections.sort(users,(o1,o2)->o1.getBirthday().compareTo(o2.getBirthday()));

使用Comparator.comparing进行排序

comparing方法一

//写法一
users.sort(Comparator.comparing(e->e.getBirthday()));

//写法二
users.sort(Comparator.comparing(User::getBirthday));

comparing方法二

Collections.sort(users,Comparator.comparing(User::getBirthday,(s1,s2)->{return s2.compareTo(s1);}))

使用Comparator.nullsFirst,Comparator.nullLast进行排序

当集合中存在null时,可以使用针对null友好的比较器,null元素排在集合的最前面(最后面)。

users.add(null);
Collections.sort(users,Comparator.nullsFirst(Comparator.comparing(User::getBirthday)));

Collections.sort(users,Comparator.nullsLast(Comparator.comparing(User::getBirthday)));

使用Comparator.thenComparing排序

可以按照多个属性进行先后排序

Collections.sort(users,Comparator.comparing(User::getBirthday).thenComparing(User::getName));

使用Comparator.reversed进行倒序

Collections.sort(users,Comparator.comparing(User::getBirthday).reversed);

 

 posted on 2021-04-23 16:31  会飞的金鱼  阅读(665)  评论(0)    收藏  举报