1.java中Comparor与Comparable的问题

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换个位置之后,就会倒着排序了,二叉树里,不是大的放在右边吗?
而且换个位置之后根节点还是第一个数吗?如果是的话,那么判断的时候
数是像哪样呢?

 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 }
原文地址:https://www.cnblogs.com/tumio/p/4401860.html