集合之TreeSet重写compareto应用

举报
brucexiaogui 发表于 2021/12/30 01:33:03 2021/12/30
【摘要】                        集合之TreeSet重写compareto应用 一、TreeSet如何判断对象值是否重复 TreeSet 和HashSet(hashCode和equals两个方法)判断...

                       集合之TreeSet重写compareto应用

一、TreeSet如何判断对象值是否重复

TreeSet 和HashSet(hashCode和equals两个方法)判断对象值是否重复不同,它是根据compareTo(Objec o)方法判断的 若该方法返回0, 就表示对象相等。

二、为什么默认的TreeSet不需要重写compareto方法?

1、看代码解毒

下面代码中set.add()方法添加的是String类型数据,因String类重写了compareto()方法。所以不需要在重写compareto()


  
  1. import java.util.Set;
  2. import java.util.TreeSet;
  3. public class ThreeSetDemo {
  4. public static void main(String[]args){
  5. //构造一个新的空 set,该 set 根据其元素的自然顺序进行排序
  6. Set set = new TreeSet();
  7. //1、传入的是String类型,String类中重写了compareto方法。所以在这里不用重写。
  8. set.add("1");
  9. set.add("2");
  10. set.add("5");
  11. set.add("4");
  12. System.out.println(set);
  13. }
  14. }

 

三、自定义比较器compareto

1、在set.add()方法添加的是一个自定义类对象的时候,由于这个类默认没有实现Comparable接口并重写compareto()方法,所以set在添加这个类对象(set.add(new Person())会抛出没有比较器异常。(java.lang.ClassCastException: day15.Person cannot be cast to java.lang.Comparable)

2、给这自定义类实现Comparable接口并重写compareto()方法


  
  1. import java.util.Set;
  2. import java.util.TreeSet;
  3. class Person implements Comparable{
  4. private Integer age;
  5. public Person(int age){
  6. this.age = age;
  7. }
  8. @Override
  9. //重写compareTo()
  10. public int compareTo(Object o) {
  11. if(o instanceof Person){
  12. Person p = (Person) o; //1、将compareTo参数类型转换为Person类型
  13. if(this.age>p.age){ //2、当前对象引用的age值和compareTo比较器的age值进行比较。前者大于后者则返回1
  14. return 1;
  15. }else if(this.age<p.age){ //3、当前对象引用的age值和compareTo比较器的age值进行比较。前者小于后者则返回-1
  16. return -1;
  17. }
  18. }
  19. return 0; //4、两者相等返回0
  20. }
  21. //二、重写toString()输出age的值,反之只能输出对象的地址。
  22. @Override
  23. public String toString() {
  24. return this.age + "";
  25. }
  26. }
  27. public class TreeSetDemo2 {
  28. public static void main(String[]args){
  29. Set set = new TreeSet();
  30. set.add(new Person(12));
  31. set.add(new Person(18));
  32. set.add(new Person(13));
  33. System.out.println(set);
  34. }
  35. }

3、结果

 

四、创建TreeSet构造方法传入比较器

  • 创建TreeSet的时候可以制定 一个Comparator
  • 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
  • add()方法内部会自动调用Comparator接口中compare()方法排序
  • 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

代码示例如下:

1、在代码中创建了一个比较器(MyComparator),实现根据人的年龄倒叙排序。

2、在TreeSet构造方法中传入MyComparator类的对象。

3、TreeSet按照MyComparator比较规则进行排序(根据年龄倒叙排序)


  
  1. import java.util.Comparator;
  2. import java.util.Set;
  3. import java.util.TreeSet;
  4. class Person2 {
  5. private Integer age;
  6. public Person2(int age) {
  7. this.age = age;
  8. }
  9. public Integer getAge() {
  10. return age;
  11. }
  12. public String toString() {
  13. return this.age + "";
  14. }
  15. }
  16. //一、创建一个比较器MyComparator
  17. class MyComparator implements Comparator {
  18. //在这里写比较规则,根据人的年龄倒叙排序
  19. public int compare(Object o1, Object o2) {
  20. Person2 p1 = (Person2) o1;
  21. Person2 p2 = (Person2) o2;
  22. if(p1.getAge() > p2.getAge()){
  23. return -1;
  24. }else if(p1.getAge() < p2.getAge()){
  25. return 1;
  26. }
  27. return 0;
  28. }
  29. }
  30. public class ComparetorDemo {
  31. public static void main(String[]args){
  32. Set set = new TreeSet(new MyComparator());
  33. set.add(new Person2(23));
  34. set.add(new Person2(13));
  35. set.add(new Person2(03));
  36. set.add(new Person2(43));
  37. set.add(new Person2(93));
  38. System.out.println(set);
  39. }
  40. }

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/85126121

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。