compare排序原理

  public int compareTo(Student o) {

        return this.age - o.age; // 比较年龄(年龄的升序)
  }

为什么return this.age-o.age是升序?  困扰很久的痛点,终于想明白,想明白就很好理解跟记忆了,还是要多学习鸭!

 

第一步:首先要知道 Collections.sort()方法进行排序的时候,sort里面默认是升序排序。这里一定要记住了。

第二步:  compare函数的返回值-1、1、0是什么个意思? 

返回值为-1, 表示左边的数比右边的数小,左右的数不进行交换。

返回值为0, 表示左边的数等于右边的数,左右的数不进行交换。

返回值为1, 表示左边的数比右边的数大,左右的数进行交换。(不进行交换的话,就没办法维持升序)

 

上面的例子中this.age可以理解成左边的数,o.age可以理解成右边的数。

this.age-o.age>0 说明左边的数比右边的数大,return this.age-o.age 返回的是一个正数,就进行左右交换,所以最终输出是升序。

this.age-o.age<0 说明左边的数比右边的数小,return this.age-o.age 返回的是一个负数,不用进行交换,所以最终输出是升序。

 

可以看看下面这个实例,就更加清晰了。

https://bbs.csdn.net/topics/390951144?page=1

 

进阶:那这里返回值等于0,难道不是完全没用了?虽然对两个数字而言交换顺序没有影响,但是如果是map对象则有影响。

具体有什么影响呢?夜深了,下次再慢慢写吧。

 

转载于:https://www.cnblogs.com/ow0843/p/10631733.html

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Web 程序设计教程 30 Student s=list.get(i);// System.out.println(s.getSno()+"," +s.getSname()+","+s.getScore()); } 其中,第 行部分在定义 List 时定义了泛型,保证 List 中的元素都是 Student 类型。因此在 第 行部分在取出 List 中的元素时就不需要再强制转换了。 另外,在前面的比较接口中也可以使用泛型,例如例 3.3 的 MyCmp 类还可以这样来实现, 请看如下语句。 public class MyCmp implements Comparator<Student>{ public int compare(Student s1, Student s2){ …… } } 总之,泛型其实是在集合创建时就设定集合中放置何种类型的对象。这样以后读出元素时就 不需要强制转换了。如果不是泛型,那么无论向集合中添加何种对象都当作对象 Object,所以取 出来也是 Object,因此需要强制转换。 本章小结 本章主要介绍了 Java 集合框架。集合是数据在缓存中存储的一个重要方式。学习本章知识, 你要深刻理解集合原理以及各种集合的区别:为什么有那么多类型不同的集合。其实,各种集合 使用场合是不一样的,因此,要注意区分 Set、List 和 Map 接口之间的异同。在 Java EE 中对数据 进行存储时都可以考虑集合。但要依据存储要求不同(如读优先还是写优先)选择适合的集合类 型。此外,本章还介绍了 Java 泛型编程。限于篇幅,我们没有详细研究泛型编程技术。如果要深 入了解泛型编程,请查阅相关资料。 习 题 上机实践 1.将本学期开设的课程名称加入到 HashSet 中,并使用迭代器遍历输出。 2.调试书本上 TreeSet 的例子,理解其原理。 3.完成以下实验: (1)定义一个学生类:属性有学号、姓名、专业、高数成绩、外语成绩、Java 课程成绩。 (2)在测试类中生成多个学生类的对象,放入 TreeSet 中,要求按照 3 门课总成绩从高到低 排序,总成绩相等按学号排序。输出排序结果。 注意实现 Comparator 接口的 compare(Object obj1,Object obj2)函数。 4.以 List 接口对象(ArrayList)为基础建立一个通信录,要求通信录中必须含有编号、姓名, 性别、电话、地址、Email 等。实现该类并包含添加、删除、修改、按姓名查等几个方法。编写 主程序测试。 参考如下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值