TreeSet中comparable和compareTo的区别

本文详细介绍了TreeSet类的底层数据结构、排序原理及其应用。着重阐述了如何通过实现Comparable接口和自定义比较器来实现元素的排序,并在实际场景中灵活运用。

TreeSet类:底层数据结构是二叉树,可以对集合中的元素进行排序。

TreeSet元素唯一性和排序(为主)的原因,是通过compareTo()方法对元素进行比较,是TreeSet集合对元素排序的依据,此方法的返回值是正数,负数,零,这个方法是Comparable接口中的。

注意:

第一种排序方式:自定义类,然后向TreeSet集合中存入自定义类的对象时,需要在自定义类中实现(implements)Comparable接口并在类中重写compareTo()方法形成自己的比较方法,另外需要注意的是在重写compareTo方法(排序)当主要条件相同时,一定要判断一下次条件(否则会视为重复元素,不会存入集合中)。

第二种排序方式:当元素(自定义类中的compareTo方法)自身不具备比较性时,或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就具备比较方式,所以需定义比较器(定义类实现Comparator接口,在类中重写compare(Object o1,Object o2)方法描述比较代码)传递(比较器的对象)给TreeSet集合的构造函数。

注:两种比较方式同时出现时,以比较器为先。

public int compareTo(Object obj)//要重写此方法必需要保证与Comparable接口中的方法一致
{
if(!(obj instanceof Person))//这里最好对传过来objPerson进行一下判断,判断是否是Person对象
throw new RuntimeException("类型不匹配");
Person p = (Person)obj;//要进行一下强转
int ageGap = this.age - p.age;
return ageGap != 0 ? ageGap : this.name.compareTo(p.name);
}

在Java中,TreeSet是一个基于红黑树实现的有序集合。当我们向TreeSet中添加元素时,它会自动根据元素的自然顺序进行排序。 在这个过程中,TreeSet会调用元素类的compareTo()方法来确定元素的顺序。因此,如果我们需要自定义元素的排序方式,就需要重写该方法。 以下是一个重写compareTo()方法的示例: ```java public class Student implements Comparable<Student> { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } // 重写compareTo方法 @Override public int compareTo(Student o) { if (this.age > o.age) { return 1; } else if (this.age < o.age) { return -1; } else { return this.name.compareTo(o.name); } } } ``` 在这个例子中,我们创建了一个Student类,它包含一个name属性一个age属性。我们在这个类中实现了Comparable接口,并重写了compareTo方法,按照年龄升序排序,如果年龄相同则按照姓名升序排序。 当我们将Student对象添加到TreeSet中时,会根据重写后的compareTo方法进行排序。 ```java TreeSet<Student> set = new TreeSet<>(); set.add(new Student("Tom", 21)); set.add(new Student("Jerry", 19)); set.add(new Student("Alice", 20)); for (Student s : set) { System.out.println(s.getName() + " " + s.getAge()); } ``` 输出结果为: ``` Jerry 19 Alice 20 Tom 21 ``` 注意:如果我们在重写compareTo方法时只考虑年龄,而不考虑姓名,则会出现相同年龄的Student对象无法添加到TreeSet中的问题。因此,在重写compareTo方法时,需要考虑到所有可能影响元素顺序的因素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值