java小白,最近学到TreeSet,我们都知道在存储自定义对象时,需要使用Comparable或使用Comparator 存储。
刚刚碰到这样一段代码。
public class Person implements Comparable {
int age;
String name;
Person(int age,String name){
this.age=age;
this.name=name;
}
@Override
public int compareTo(Object o) {
Person p=(Person)o;
if (p.age% 2 == 0) {
return -1;
} else {
return 1;
}
}
}
public class Test1 {
public static void main(String[] args) {
TreeSet<Person> treeSet = new TreeSet<>();
treeSet.add(new Person(1,"aa"));
treeSet.add(new Person(2,"cc"));
treeSet.add(new Person(3,"bb"));
treeSet.add(new Person(4,"dd"));
treeSet.add(new Person(5,"ee"));
for (Person p : treeSet) {
System.out.println(p.age);
}
}
执行结果为:
1
3
5
4
2
自己刚开始对compareTo(Object o)方法不够了解,所以debug半天才弄明白。
现在分享下思路:
compareTo(Object o)方法中的Object o 为当前集合中所存在的元素对象,一般我们正常比大小时,比如将代码写成按age大小升序排列:
@Override
public int compareTo(Object o) {
Person p=(Person)o;
return this.age-p.age;
}
然后主方法按照age=1 2 3 4 5依次插入对象时,第一次直接插入1;第二次插入2时,age=2的当前对象将与集合中所有元素按照compareTo(Object o)中的规则一一比较,即this.age-p.age=2-1,return 1,表示当前对象(age=2)比集合内对象(age=1)大,345依次比较集合内元素所以主方法遍历集合结果为:12345。
但当compareTo(Object o)方法如下时,其比较规则发生变化。
@Override
public int compareTo(Object o) {
Person p=(Person)o;
if (p.age% 2 == 0) {
return -1;
} else {
return 1;
}
}
运行程序过程如下,第一次还是插入1。第二次开始与集合中的元素相比较时,当前元素(this.age)能否比集合内元素(p.age)大,完全取决于被比较的元素(p.age)是否为单数。
如果被比较元素为单数则return 1,表示当前元素大于集合内被比较的元素。例如第二次插入2时,2和1的大小,取决于1。1不能被2整除所以return 1,表示2比1大。
第三次add传入3,3按照compareTo方法规则分别与1,2进行比较,得出3>1且3<2
第四次add传入4,4按照compareTo方法规则分别与1,2,3进行比较,得出2>4>3>1
第五次传入5,5按照compareTo方法规则分别与1,2,3,4进行比较,得出1<3<5<4<2
因而结果为13542。
树形结构如下:
以上是本人小白理解,如有错误烦请大佬指正,谢谢。
标签:return,自定义,age,Object,Person,add,compareTo From: https://blog.csdn.net/m0_56471030/article/details/137376431