【代码】
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 }