java中compar_java中Comparor与Comparable的问题

标签:

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换个位置之后,就会倒着排序了,二叉树里,不是大的放在右边吗?

而且换个位置之后根节点还是第一个数吗?如果是的话,那么判断的时候

数是像哪样呢?

20181023225402354921.png

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 }

标签:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值