标签:
1.Comparator中compare()与Comparable中compareTo()方法的区别
Treeset集合创建对象后,
A:如果是空构造,即TreeSet ts = new TreeSet(); ,那么ts.add();,时需要在Student上implements Comparable接口,在下面重写compareTo()方法,因为此时的add()调用的是compareTo()方法,底层以红黑二叉树,判断之后,排序
B:如果是带参构造,即TreeSet ts = new TreeSet(Comparator super E>comparator); ,ts.add()时,需要自己写个MyComparator类implements Comparator接口,(如果调用的较少的话,可以在创建对象的时候,以内部类的形式重写方法)或者在在MyComparator中重写compare()方法.
C:未解决的问题:为什么把
int num = s1.getName().length() -s2.getName().length();
(二叉树,左中右顺序)
s1与s2换个位置之后,就会倒着排序了,二叉树里,不是大的放在右边吗?
而且换个位置之后根节点还是第一个数吗?如果是的话,那么判断的时候
数是像哪样呢?
1 importjava.util.Comparator;2 importjava.util.TreeSet;3
4 /*
5 * 需求:按照姓名的长度排序6 *7 * public TreeSet(Comparator super E> comparator):构造一个新的空 TreeSet,它根据指定比较器进行排序。8 */
9 public classTreeSetDemo {10 public static voidmain(String[] args) {11 //创建集合对象12 //TreeSet ts = new TreeSet();13 //比较器排序14 //TreeSet ts = new TreeSet(new MyComparator());15 //内部类的形式
16 TreeSet ts = new TreeSet(new Comparator() {17 @Override18 public intcompare(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 returnnum3;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 importjava.util.Comparator;2
3 public class MyComparator implements Comparator{4
5 @Override6 public intcompare(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 returnnum3;14 }15
16 }
1 //或者public class Student implements Comparable
2 public classStudent {3 //姓名
4 privateString name;5 //年龄
6 private intage;7
8 publicStudent() {9 super();10 }11
12 public Student(String name, intage) {13 super();14 this.name =name;15 this.age =age;16 }17
18 publicString getName() {19 returnname;20 }21
22 public voidsetName(String name) {23 this.name =name;24 }25
26 public intgetAge() {27 returnage;28 }29
30 public void setAge(intage) {31 this.age =age;32 }33
34 @Override35 publicString toString() {36 return "Student [name=" + name + ", age=" + age + "]";37 }38
39 //@Override40 //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 }
标签: