public class Staff implements Comparable<Staff> {
private String name;
private Integer age;
private String gender;
public Staff() {
}
public Staff(String name, Integer age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public int compareTo(Staff o) {
return Integer.compare(this.age, o.age);
}
public class TestStaff {
public static void main(String[] args) {
TreeSet set = new TreeSet<>();
Staff staff1 = new Staff("lee",25,"men");
set.add(staff1);
Staff staff2 = new Staff("chou",27,"men");
set.add(staff2);
Staff staff3 = new Staff("zhao",30,"women");
set.add(staff3);
System.out.println(set);
}
}
我的基础不是很好,希望各位能指点一二
为什么会自动调用Staff类里的compareTo方法呢?而且为什么没有用staff1.compareTo()就直接通过set.add()调用了该方法
这就要看 TreeSet 的 add 方法的源码了,
TreeSet内部实现是 TreeMap,再继续看 put方法; 每次添加一个元素,就会 调用 添加数据的 compareTo方法,往 二叉树的左节点或者右节点上添加数据。
这是因为Set集合中的元素是有序的,而且是通过compareTo方法进行排序的。当向Set集合中添加元素时,会自动调用元素类的compareTo方法来确定插入位置。如果两个元素的compareTo比较结果相同,则被认为是相同的元素,不会重复插入。
因此,如果想要在Set集合中保持元素的顺序,就必须在元素类中实现Comparable接口并重写compareTo方法。
以下是Staff类的例子:
public class Staff implements Comparable<Staff> {
private String name;
private int age;
public Staff(String name, int age) {
this.name = name;
this.age = age;
}
// 重写compareTo方法,按照年龄升序排序
@Override
public int compareTo(Staff staff) {
return this.age - staff.age;
}
// hashCode和equals方法也要重写
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Staff staff = (Staff) obj;
return age == staff.age && Objects.equals(name, staff.name);
}
}
这里重写了compareTo方法,按照年龄升序排序。同时也重写了equals和hashCode方法,以保证Set集合能够正确地判断两个对象是否相同。