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 }

java中compar_1.java中Comparor与Comparable的问题相关推荐

  1. java.lang类在电脑哪个位置_Java中的java.lang.Class API 详解

    且将新火试新茶,诗酒趁年华. 概述 Class是一个位于java.lang包下面的一个类,在Java中每个类实例都有对应的Class对象.类对象是由Java虚拟机(JVM)自动构造的. Class类的 ...

  2. java list 排序_Java中List的排序

    场景 Bean定义如下,仅有一个类型为Integer的age字段. @NoArgsConstructor @AllArgsConstructor(staticName = "of" ...

  3. Java+包裹类型_java中的包裹类型

    包裹类型将一个基本数据类型的数据转换成对象的形式,从而使得它们可以像对象一样参与运算和传递.下表列出了基本数据类型所对应的包裹类型: 基本类型    包裹类型 boolean    Boolean c ...

  4. 数据结构与算法-java笔记一 更新中

    数据结构与算法-java笔记一 更新中 数据结构与算法 什么是数据结构.算法 数据结构学了有什么用: 线性结构 数组 特点 应用 链表 存储结构 链表类型 单链表 双向链表 双向循环链表 链表与数组的 ...

  5. 【JAVA SE】java中的String类

    目录 String类 什么是String类? String类的定义方式 String的内部 如何求字符串长度呢? String类对象的比较 字符串查找 总结charAt 字符串转化 数字与字符串之间的 ...

  6. Java并发编程(中下篇)从入门到深入 超详细笔记

    接上一篇博客笔记:Java并发编程(中上篇)从入门到深入 超详细笔记_未来很长,别只看眼前的博客-CSDN博客https://blog.csdn.net/weixin_53142722/article ...

  7. java treeset 合并_Java中TreeSet合并重复数据

    TreeSet与HashSet之间的区别: TreeSet会自动按自然排序法给元素排序,相应的性能会差一点.而HashSet是根据元素的hashCode自动给元素排序的,如果我们不需要使用排序功能,则 ...

  8. 【Java 8 新特性】Java Comparator 在 SortedMap 中使用 | TreeMap 和 ConcurrentSkipListMap 排序

    Java Comparator 在 SortedMap 中使用 | TreeMap 和 ConcurrentSkipListMap 排序 在 TreeMap 中使用 在 ConcurrentSkipL ...

  9. matlab中调用java代码_Matlab中调用第三方Java代码

    在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...

  10. java string 占位符_驳《阿里「Java开发手册」中的1个bug》?

    前两天写了一篇关于<阿里Java开发手册中的 1 个bug>的文章,评论区有点炸锅了,基本分为两派,支持老王的和质疑老王的. 首先来说,无论是那一方,我都真诚的感谢你们.特别是「二师兄」, ...

最新文章

  1. 软件工程概论冲刺 第6天
  2. UA OPTI512R 傅立叶光学导论12 傅立叶级数基础
  3. doubango简介
  4. 关于CTeX的几个大坑
  5. Dapr 交通流量控制示例
  6. asterisk 支持 VP8 video编码 实现安卓的视频通话
  7. Linux系统的服务器配置minicom接console线调试交换机的步骤
  8. AngularJS控制器和过滤器学习(三)
  9. mysql dump锁表_mysqldump 锁表和解锁语句
  10. 9.2【彩色模型】-----基于Opencv实现-----把一幅RGB图转为CMY图
  11. encode_chunked=req.has_header(‘Transfer-encoding‘))问题解决方法
  12. CentOS 7 安装Mono 和 MonoDevelop
  13. 【编译原理笔记11】中间代码生成:类型表达式,声明语句的翻译
  14. 华为/华三IS-IS单区域配置
  15. 在Debian下安装LAMP
  16. 深度学习笔记(一)——初步理解yoloV3原理
  17. at24c08 E2PROM的I2C设备驱动实例——基于mini2440
  18. 视频教程-Unity5入门及进阶项目实战 星际迷航-Unity3D
  19. 面向削峰填谷的电动汽车多目标优化调度策略——附代码
  20. 计算机联锁系统工程设计论文,计算机联锁控制系统论文

热门文章

  1. python实用案例教程第四章答案_python 入门到实践第四章案例
  2. 解决:Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools“
  3. 树莓派 --- 控制舵机转动代码Python
  4. SPSS比较两组数据有无显著性差异 独立样本T检验
  5. 分布式系统如何保证数据一致性
  6. cocos2dx检测及预防外挂加速
  7. excel 基于RFM模型、帕累托分析的用户画像项目实战
  8. Linux下用rm删除的文件的恢复方法
  9. 软件测试行业用mac好还是win好,为了在Mac上也能用好Windows,我做了这些调整
  10. 准备工作-PPT母版