TreeSet中类实现compareTo以及内部类中实现compareTo

TreeSet作为集合中一个重要的组成,虽说用的没有ArrayList常见,但还是非常重要的,主要用于非重复集合的排序

先说一下TreeSet,集合中必须包括的是引用类型,若想输入int,则需要转化为Inetger,成为引用类型,并且用ComeparTo方法判断正在输入的字段和集合中包括的字段是否相同,从而确定是输入还是不输入

其中有两种方法,分别为Comparable和 Comparator

其中 Comparable是在类中继承Comparable接口,主要用于自己创建的类,而 Comparator则主要就是用于系统类(PS:系统类无法修改,无法继承接口,所以使用内部类实现)

以自己创建的一个类Student为例:

 
  1. public class Student {

  2. private String name;

  3. private int age;

  4. private int sno;

  5. public String getName() {

  6. return name;

  7. }

  8. public void setName(String name) {

  9. this.name = name;

  10. }

  11. public int getAge() {

  12. return age;

  13. }

  14. public void setAge(int age) {

  15. this.age = age;

  16. }

  17. public int getSno() {

  18. return sno;

  19. }

  20. public void setSno(int sno) {

  21. this.sno = sno;

  22. }

  23. public Student(String name, int age, int sno) {

  24. super();

  25. this.name = name;

  26. this.age = age;

  27. this.sno = sno;

  28. }

  29. @Override

  30. public String toString() {

  31. return "Student [name=" + name + ", age=" + age + ", sno=" + sno + "]";

  32. }

  33. }

先说Comparable:

因为使用Comparable,则需要先使Student继承接口Comparable,并注明泛型

如:public class Student implements Comparable<Student>{}

因为继承了Comparable接口,则需实现Compareto方法,说一下我认为的Compareto方法

刚开始我不太清楚Compareto在何时调用,在看了Debug之后,注意到了在向TreeSet集合中添加新的引用类型时调用的,主要就是判断新添加的应用类型是否与集合中的引用类型重复,若重复,则不添加,若不重复,则添加。

简单说一下Compareto方法的实现:

因为Comparable为接口,则重写CompareTo,如:public int compareTo(Student s),因为在Student的开头已经确定泛型<Student>,所以这里默认泛型<Student>,CompareTo是有 int 返回值的,如果返回值为0,则认为正在输入的应用类型和集合中已有的引用类型重复,若不为0,则输入集合中。重要的是,这时候的int值并没有舍弃不用,而是用来判断集合中顺序的重要依据,所谓的正数的就放比较数的前面,负数的就放在比较数的后面,然后挨个与集合每个值相比较,确定自己的位置。所以我们想要有一个按照自己想法的排序时,一定要想好怎么重写CompareTo方法,这里我们用Student举例,我想让年龄大的排在前面,若年龄相同,则把学号大的放在前面。我们需要先保证年龄不相同的进行比较,然后输出年龄的差值,相互比较时确定新输入学生的位置。如果年龄相同则用同样的方法比较学号,因为学号是每个人都不同的,所以之后我们不用比较了,CompareTo重写的代码如下:

public int compareTo(Student s) {
if(this.age!=s.age){
return s.age-this.age;
}else{
return s.sno-this.sno;
}
}
这里就是在Comparable中CompareTo方法的重写,在说一下Comparator

Comparator实现的时候主要是因为调用的类不好修改,无法继承,所以这时候我们使用匿名内部类,至于匿名内部类,我回头再写一个说一下我的看法,这里不做详细介绍

匿名内部类是在new TreeSet的时候使用,在调用Comparator接口的时候当然也要重写ComparaTo的方法,其中方法的重写与Comparable相同,主要就是CompareTo方法的重写与匿名类的实现,代码如下:

TreeSet<Student> set = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s,Student s1) {
if(s.getAge()!=s1.getAge()){
return s.getAge()-s1.getAge();
}else{
return s.getSno()-s1.getSno();
}
}
});

Comparable和 Comparator的差别并不大,只是在调用类中实现或者是在匿名类中实现的差别而已。我认为重要的是CompareTo方法的重写,有什么不足的请大家指教0.0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值