我们都知道,要对自建对象按照一定规则进行排序的话,要求自建对象实现Comparable接口,并重写compareTo() 方法,但compareTo() 方法的释义却不是那么容易搞清楚,下面举例进行阐述:

声明一个Student类(成员变量id,name)实现Comparable接口,然后重写compareTo()方法,

public class Student implements Comparable<Student>{
private int id;
private String name; @Override
public int compareTo(Student o) {
if(this.id < o.id)
return -1;
else if(this.id > o.id)
return 1;
else
return 0;
} //getter setter ... //toString ... }

然后新建测试用例,

public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Student s1 = new Student(10,"s1");
Student s2 = new Student(20,"s2");
Student s3 = new Student(30,"s3");
studentList.add(s1);
studentList.add(s2);
studentList.add(s3);
Collections.sort(studentList);
System.out.println(studentList);
}

运行得到结果:

[Student:{id=10, name=s1}, Student:{id=20, name=s2}, Student:{id=30, name=s3}]

可以看出,集合中存的student对象经过 Collections.sort(studentList)方法后,进行了排序,此时很容易理解,因为重写的方法compareTo方法中,定义了this.id < o.id return -1;,即当前对象的id小于传入的对象id时,值就为-1,也就是说符合从小到达的顺序逻辑,打印输出的结果也就类似于升序的方式进行输出打印,

此时从语义上理解id值的大小,也即为id=10 < id=20 < id=30;

但如做以下改动(eg-->2):

	@Override
public int compareTo(Student o) {
if(this.id < o.id)
return 1;
else if(this.id > o.id)
return -1;
else
return 0;
}

即当前对象的id小于传入的对象id时,值却为正整数1,这里就让人很不好理解了,我们先不管,先看此时的打印输出:

[Student:{id=30, name=s3}, Student:{id=20, name=s2}, Student:{id=10, name=s1}]

从数值上看,是降序排列,但这里我们其实要理解为是升序,只不过是数值大小的语意改变了,变成了id=30 < id=20 < id=10 的顺序,10反而要看做是最大值。

如果按照这种思维去理解eg-->2这种情况,就很好理解compareTo()方法,其实最后的排序都可看做是升序排列,不过经过compareTo()方法后,我们定义了id的值得大小有所改变,eg-->2中,我们其实定义了id的值的大小是10> 20 > 30 , 其实也就是最终的排序还是数值小(30)的那个优先级最高,数值大(10)的放到了最后;

最初遇到这个问题是在慕课网学习数据结构--优先队列这个概念时遇到的,想了好半天想不通,最后请教了相关老师,最终得以解惑~http://coding.imooc.com/learn/questiondetail/135180.html

最新文章

  1. java集合-补充HashMapJDK1.8
  2. 【转载】Python与ArcGIS Engine的集成
  3. SDK Manager 中 没有 Support Library怎么弄?
  4. How Spring Boot Autoconfiguration Magic Works--转
  5. 矩阵求逆算法及程序实现(C++)
  6. 【数论】二进制GCD
  7. ubuntu下firefox无法看bilibili解决方案
  8. win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面
  9. Restful风格的简单实现办法
  10. 瀑布流布局--jQuery写法
  11. Android的移动存储之SharedPreferences
  12. win7下Java环境变量配置及说明
  13. CF #368 div2
  14. java IO(三):字符流
  15. ejs常用语法
  16. torch.utils.data.DataLoader()中的pin_memory参数
  17. 【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理
  18. ORACLE PACKAGE中查看包的依赖关系
  19. OpenGL学习记录
  20. [SoapUI] 通过context获取response并解析里面的某个字段的值

热门文章

  1. hashRouter and BrowserRouter
  2. 2018-2-22-在-windows-安装-Jekyll
  3. dell iDRAC7配置远程访问管理
  4. 链接socket加异常
  5. js中按下回车触发事件
  6. 探索Redis设计与实现5:Redis内部数据结构详解——quicklist
  7. linux基础知识汇总(三)-vmware下ubuntu上网配置
  8. QC增加Test、Defect字段
  9. JS 常用字符串,数组操作
  10. 建立logback.xml 配合MDC 实现追踪