1.Comparator中compare()与Comparable中compareTo()方法的区别
Treeset集合创建对象后,
A:如果是空构造,即TreeSet<Student> ts = new TreeSet<Student>(); ,那么ts.add();,时需要在Student上implements Comparable<Student>接口,在下面重写compareTo()方法,因为此时的add()调用的是compareTo()方法,底层以红黑二叉树,判断之后,排序
B:如果是带参构造,即TreeSet<Student> ts = new TreeSet<Student>(Comparator<? super E>comparator); ,ts.add()时,需要自己写个MyComparator类implements Comparator<Student>接口,(如果调用的较少的话,可以在创建对象的时候,以内部类的形式重写方法)或者在在MyComparator中重写compare()方法.
C:未解决的问题:为什么把
int num = s1.getName().length() - s2.getName().length();
(二叉树,左中右顺序)
s1与s2换个位置之后,就会倒着排序了,二叉树里,不是大的放在右边吗?
而且换个位置之后根节点还是第一个数吗?如果是的话,那么判断的时候
数是像哪样呢?
![](//images0.cnblogs.com/blog2015/741603/201504/081108574467280.png)
1 import java.util.Comparator; 2 import java.util.TreeSet; 3 4 /* 5 * 需求:按照姓名的长度排序 6 * 7 * public TreeSet(Comparator<? super E> comparator):构造一个新的空 TreeSet,它根据指定比较器进行排序。 8 */ 9 public class TreeSetDemo { 10 public static void main(String[] args) { 11 // 创建集合对象 12 // TreeSet<Student> ts = new TreeSet<Student>(); 13 // 比较器排序 14 // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator()); 15 // 内部类的形式 16 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { 17 @Override 18 public int compare(Student s1, Student s2) { 19 // 按照姓名的长度排序 20 int num = s1.getName().length() - s2.getName().length(); 21 // 当姓名的长度相同时,判断姓名是否相等 22 int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) 23 : num; 24 // 当姓名相同时,判断年龄是否相等 25 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2; 26 return num3; 27 } 28 }); 29 // 创建学生对象 30 Student s1 = new Student("小fsd名", 12); 31 Student s2 = new Student("小sdf白", 22); 32 Student s3 = new Student("小sf黑", 33); 33 Student s4 = new Student("小菜", 13); 34 Student s5 = new Student("小黑", 33); 35 Student s6 = new Student("小sdfsdfc", 13); 36 Student s7 = new Student("小dsfsd黑黑", 33); 37 Student s8 = new Student("小sfsd菜", 122); 38 Student s9 = new Student("小黑", 33); 39 Student s10 = new Student("小c", 13); 40 41 // 添加元素 42 ts.add(s1); 43 ts.add(s2); 44 ts.add(s3); 45 ts.add(s4); 46 ts.add(s5); 47 ts.add(s6); 48 ts.add(s7); 49 ts.add(s8); 50 ts.add(s9); 51 ts.add(s10); 52 53 // 遍历元素 54 for (Student s : ts) { 55 System.out.println(s); 56 } 57 } 58 }
1 import java.util.Comparator; 2 3 public class MyComparator implements Comparator<Student> { 4 5 @Override 6 public int compare(Student s1, Student s2) { 7 // 按照姓名的长度排序 8 int num = s1.getName().length() - s2.getName().length(); 9 // 当姓名的长度相同时,判断姓名是否相等 10 int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; 11 // 当姓名相同时,判断年龄是否相等 12 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2; 13 return num3; 14 } 15 16 }
1 //或者public class Student implements Comparable 2 public class Student { 3 // 姓名 4 private String name; 5 // 年龄 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 String toString() { 36 return "Student [name=" + name + ", age=" + age + "]"; 37 } 38 39 // @Override 40 // public int compareTo(Student s) { 41 // // 按照姓名的长度排序 42 // int num = this.name.length() - s.name.length(); 43 // // 当姓名的长度相同时,判断姓名是否相等 44 // int num2 = num == 0 ? this.getName().compareTo(s.getName()) : num; 45 // // 当姓名相同时,判断年龄是否相等 46 // int num3 = num2 == 0 ? this.getAge() - this.getAge() : num2; 47 // return num3; 48 // } 49 }