我们都知道,要对自建对象按照一定规则进行排序的话,要求自建对象实现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

javaSE Comparable接口中的compareTo()方法的更多相关文章

  1. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  2. TreeMap——实现comparable接口并重写CompareTo方法

    public class TreeMapTest { public static void main(String[] args) { Map<Student,Integer> stude ...

  3. TreeSet——实现Comparable接口并重写CompareTo()方法

    TreeSet是以自然顺序存的数据,例如 Set<Student> students=new TreeSet(); students.add(new Student("111&q ...

  4. TreeSet集合的自然排序与比较器排序、Comparable接口的compareTo()方法

    [自然排序] package com.hxl; public class Student implements Comparable<Student> { private String n ...

  5. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  6. TreeSet的自然排序(自定义对象 compareTo方法)

    >要实现自然排序,对象集合必须实现Comparable接口,并重写compareTo()方法 >一般需求中描述的是"主要条件",如:按姓名长度排序.  需注意次要条件 ...

  7. Collections -集合排序compareTo方法重写,shuffle,addall

    package cn.learn.collection.Collections; /* 排序的对象的类,实现comparable借口,重写compareto方法 若要打印必须重写toString方法, ...

  8. java中的compareto方法的详细介绍

    java中的compareto方法的详细介绍 Java Comparator接口实例讲解(抽象方法.常用静态/默认方法) 一.java中的compareto方法 1.返回参与比较的前后两个字符串的as ...

  9. TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

    /** * * @author ocq */ class Parent implements Comparable { private int age = 0; public Parent(int a ...

随机推荐

  1. Web前端基础学习-2

    盒子模型 在页面中,我们将所有的元素全部看做是一个盒子,页面布局就是将大大小小不同的盒子堆砌在一起,而一个盒子由以下几部分组成: padding:内边距,内容到边框的距离: margin:外边距,其他 ...

  2. Mac利用分屏spliter

    有时候一台电脑学习很鸡肋,特别是在照葫芦画瓢阶段,只能来回的切换页面,效率极其低下,一直希望可以将其分别显示,互不干扰.今天在mac发现此方法,大大提高了学习效率,所以今天分享给大家: 方法一:长按窗 ...

  3. Docker部署Flask应用

    创建应用 首先,编写一个简单的Flask应用:docker_test/flask_app.py Docker 安装 请根据自己的操作系统自行安装. Docker简介 Docker 镜像 Docker镜 ...

  4. MySQL-常用引擎

    来自:https://www.cnblogs.com/xujishou/p/6343431.html :https://www.cnblogs.com/laowenBlog/p/8405614.htm ...

  5. 【记录】Java NIO实现网络模块遇到的BUG

    1.背景 通过JavaNio实现一个简单的网络模块,有点像Netty的线程模型,一个线程(AcceptThread)建立新连接,把新连接绑定到某个SelectorThread,SelectorThre ...

  6. 牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)

    传送门: 淳平的形态形成场 题解: 把a排序后,直接统计答案恰好为a[i]并不好做,可以统计答案>a[i]的方案数,设为\(f[i]\). 即不存在一个联通块,所有的权值都<=a[i]. ...

  7. MOSFET学习

    MOS/CMOS集成电路简介及N沟道MOS管和P沟道MOS管 在实际项目中,我们基本都用增强型mos管,分为N沟道和P沟道两种. 我们常用的是NMOS,因为其导通电阻小,且容易制造.在MOS管原理图上 ...

  8. 楼房重建 (rebuild)

    楼房重建 (rebuild) 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子.为了简化问题 ...

  9. 67、saleforce的object的describe方法使用

    使用Schema类的describesSObjects方法获取描述sObject结果.使用此方法可以通过sObject类型名称描述一个或者多个sObject描述信息. //sObject types ...

  10. [c#源码分享]TCP通信中的大文件传送

    NetworkComms网络通信框架序言 源码   (为节省空间,不包含通信框架源码,通信框架源码请另行下载) 文件传送在TCP通信中是经常用到的,本文针对文件传送进行探讨 经过测试,可以发送比较大的 ...