56、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。
代码如下
import java.util.*;
public class Leetcode {
public static void main(String[] agrs){
Map<Integer,Student> map = new TreeMap<>();
Student student = new Student();
map.put(1,student);
Set<Student> set = new TreeSet<>();
set.add(student);
}
}
public class Student {
private String name;
private int age;
private int score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
如果想把自定义类的对象存入TreeSet用sort进行排序, 那么才需要实现Comparable接口,你的“回答”要么断章取义,要么是错的。
之前说了,两个序不是一回事。
hello world放入字符集合,拿出来还是hello world叫有序。拿出来是别的,比如hwoeollrdl就是无序
实现Comparable是为了排序,比如 edhllloorw,这个叫排序。
有序分
2种
1、进出顺序 相同 这叫有序,
2、 进去之后 在里面进行自然排序 以数字 字母 或者自定义排序器 进行 ,compator更方便,不需要类实现接口。 comparable就是后者。实体类不实现该接口无法排序。String 可以排序是自带实现了comparable 所以用户需要排序也要实现。当然最好使用compator更方便不需要破坏原类
如果仅仅是为了有序 不是必须实现comparable【该比较方法compareto好像是一个参数】, 可以选择实现compator比较器【该compar方法好像是2个参数】
如果是为了有序且不想单独设计比较器compator 那么只有该类实现comparable接口。
综上所述 treemap有重载构造。可以传入一个实现了comparable接口的自然排序规则,也可以传入一个实现了compator接口的任何自定义的排序规则。后者更常用。