集合类的排序方式

集合类的排序方式

  • 几种集合的排序方式
    • 简述
    • 实现Comparable
    • 借助Comparator
    • 通过Stream
  • 知识拓展
    • 有了Comparable为什么还需要Comparator呢?
    • CompareTo 和equals的使用场景有啥子区别?
    • Set本就是无序的,还排序干啥子?
    • Set真的是插入无序吗?

几种集合的排序方式

简述

Java.util包里面的List接口继承了Collection接口,用来存放对象集合,所以,对这些对象进行排序的时间,要么让对象类自己实现同类对象的比较,要么借助比较器进行比较排序。

举个例子:学生实体类,包含姓名、年龄等属性,比较时先按照姓名升序排序,如果姓名相同,就按照年龄升序排序。

实现Comparable

第一种:实现类自己实现Comparable接口比较

public class Student implements Comparable <Student> {
    private String name;
    private int age;
    
    @Override
    public int compareTo(Student o) {
        int flag = this.name.compareTo(o.name);
        if(flag == 0) {
            flag = this.age - 0.age;
        }
        return flag;
    }
}
collections.sort(students);

借助Comparator

第二种:借助于比较器进行排序。

public class Student {

    private String name;
    private int age;
}
Collections.sort(students, (o1,o2) -> {
    int flag = o1.getName().compareTo(o2.getName());
    if(flag == 0) {
        flag = o1.geAge() - o2.getAge();
    }
   return flag; 
});

通过Stream

第三种:借助于Stream进行排序,借助于Stream 的 API ,底层还是通过Comparable实现的。

public class Student {
   private String name;
   private int age;
}
//如果Student实现了Comparable
students.stream().sorted().colect(Collectors.toList());
//如果Student没有实现Comparable
students.stream().sorted((o1,o2) -> {
    int flag = o1.getName().compareTo(o2.geiName());
    if(flag == 0) {
        flag = o1.getAge() - o2.getAge();
    }
    return flag;
}).collect(Collectors.toList())

知识拓展

有了Comparable为什么还需要Comparator呢?

Comparable用于使某个类具备可排序能力。如之前的Student类,实现该接口后覆盖其compareTo方法,即可具备有排序的能力。

但是仍然存在一些二方库的类没有实现Comparable,但是调用方法也需要比较的,此时就需要使用Comparator接口。

Comparator是一个比较接口,可以用来给不具备排序能力的对象进行排序,上面的代码中对不具备排序能力的Student类进行排序。

CompareTo 和equals的使用场景有啥子区别?

  • compareTo常用于排序和BigDecimal等数值的比较
  • equals的话,则是常用于业务语义中两个对象是否相等,比如注册信息是两次输入密码是否一致。再比如String常常通过equals来比较字面的意义是不是相同。

Set本就是无序的,还排序干啥子?

这里说的是两个浴巾的不同,Set的无序,指的是插入顺序是无序的,虽然Set的插入顺序是无序的,Set也可以基于sortedSet要求对象实现Comparable来对Set中的元素进行排序。

Set真的是插入无序吗?

并不是。
Set有一个实现类是LinkedHashSet,它引用了LinkedHashMap,通过双向链表记录了每一个node的插入顺序(可选哦),以此来达到Set的插入有序性。

记得点关注!!!

你可能感兴趣的:(Java集合类,java,算法,开发语言)