Comparable接口的compareTo()方法

Posted 化身孤岛的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comparable接口的compareTo()方法相关的知识,希望对你有一定的参考价值。

【代码】

 1 package com.hxl;
 2 
 3 public class Student implements Comparable<Student> {
 4 
 5     private String name;
 6     private int age;
 7 
 8     public Student() {
 9         super();
10     }
11 
12     public Student(String name, int age) {
13         super();
14         this.name = name;
15         this.age = age;
16     }
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }
33 
34     @Override
35     public int compareTo(Student s) {
36         // 先让两个对象的age属性做差比较,这个是主要排序条件
37         int num = this.age - s.age;
38         // 若age属性相同,再比较name属性(String类本身实现了Comparable接口)
39         // 即在主要排序条件相同的情况下,次要排序条件起作用
40         int flag = num == 0 ? this.name.compareTo(s.name) : num;
41         // 返回比较结果
42         return flag;
43     }
44 }
 1 package com.hxl;
 2 
 3 import java.util.TreeSet;
 4 
 5 public class Test {
 6     public static void main(String[] args) {
 7         TreeSet<Student> ts = new TreeSet<Student>();
 8         ts.add(new Student("cc", 11));
 9         ts.add(new Student("ee", 11));
10         ts.add(new Student("cc", 22));
11         ts.add(new Student("aa", 22));
12         ts.add(new Student("bb", 11));
13 
14         for (Student s : ts) {
15             System.out.println(s.getName()+"_"+s.getAge());
16         }
17 
18         /*
19             为什么TreeSet集合中的元素既唯一又有序呢?
20             原因是它在存储元素的时候就是有序存储的(红黑树结构存储)
21             TreeSet的add()方法底层依赖的是Comparable的compareTo方法
22             这里就是说元素类本身要有自己的compareTo方法
23             所以元素类本身必须实现Comparable接口,重写compareTo方法
24             compareTo方法有个特点:它返回的是int型数据,结果有三类负数、0、正数
25             例如:(Java中一些常见的有比较意义的一些类都实现了Comparable接口,如Integer类)
26                 Integer a = new Integer(10);
27                 Integer b = new Integer(20);
28                 int num = a.compareTo(b);     //因为a小于b,所以num返回的是负数
29             而TreeSet的add()方法这样理解此返回值:
30             即返回负数则比根节点小,元素在此集合中唯一,元素存放根的左孩子
31             返回正数则比根节点大,元素在此集合中唯一,元素存放根的右孩子
32             返回0则表示,元素相同,在此集合中不唯一,故而丢掉不存放
33             由此可见,我们的重写的compareTo()方法决定了TreeSet集合中元素的去留和顺序!
34         */
35     }
36 }

 

以上是关于Comparable接口的compareTo()方法的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记--如何使用Comparable接口里compareTo 方法进行排序

Comparable接口的简单使用

TreeSet——实现Comparable接口并重写CompareTo()方法

java的comparable接口啥意思

如果一个接口只有方法声明,那么接口返回int值的可比性如何

Java集合框架上机练习题:编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法.....