javaSE Comparable接口中的compareTo()方法
我们都知道,要对自建对象按照一定规则进行排序的话,要求自建对象实现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()方法的更多相关文章
- Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)
代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...
- TreeMap——实现comparable接口并重写CompareTo方法
public class TreeMapTest { public static void main(String[] args) { Map<Student,Integer> stude ...
- TreeSet——实现Comparable接口并重写CompareTo()方法
TreeSet是以自然顺序存的数据,例如 Set<Student> students=new TreeSet(); students.add(new Student("111&q ...
- TreeSet集合的自然排序与比较器排序、Comparable接口的compareTo()方法
[自然排序] package com.hxl; public class Student implements Comparable<Student> { private String n ...
- Java——String类中的compareTo方法总结
String类的定义: java.lang 类 String java.lang.Object java.lang.String 所有已实现的接口:Serializable, C ...
- TreeSet的自然排序(自定义对象 compareTo方法)
>要实现自然排序,对象集合必须实现Comparable接口,并重写compareTo()方法 >一般需求中描述的是"主要条件",如:按姓名长度排序. 需注意次要条件 ...
- Collections -集合排序compareTo方法重写,shuffle,addall
package cn.learn.collection.Collections; /* 排序的对象的类,实现comparable借口,重写compareto方法 若要打印必须重写toString方法, ...
- java中的compareto方法的详细介绍
java中的compareto方法的详细介绍 Java Comparator接口实例讲解(抽象方法.常用静态/默认方法) 一.java中的compareto方法 1.返回参与比较的前后两个字符串的as ...
- TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
/** * * @author ocq */ class Parent implements Comparable { private int age = 0; public Parent(int a ...
随机推荐
- microtime函数用法
/** * microtime函数 * 返回:如果参数为空,则返回字符串 "微妙部分(单位:秒) 秒",字符串的两部分都是以"秒"为单位返回的 * 如果参数为 ...
- 【记录】jquery动态控制div隐藏或者显示
1.jQuery判断一个元素当前状态是显示还是隐藏 $("#id").is(':visible'); //true为显示,false为隐藏 $("#id").i ...
- 五、properties编写
1.properties和yml编写对比 2.properties中文乱码解决 上面的内容输出的结果 原因 idea 默认编码是UTF-8,properties需要修改对应的编码 设置编码后的结果正常 ...
- 力扣——gas station (加油站) python实现
题目描述: 中文: 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] ...
- 基于window ftp上传问题
FtpClient上传文件异常:java.net.SocketException: Connection reset cmd输入: netsh advfirewall set global State ...
- 小程序内嵌H5页面判断微信及小程序环境
判断微信及小程序环境 1.H5页面引入jweixin-1.3.2.js 2. var ua = window.navigator.userAgent.toLowerCase(); if(ua.matc ...
- 深入了解 Flink 网络栈(二):监控、指标和处理背压
在之前的文章中,我们从高级抽象到底层细节各个层面全面介绍了 Flink 网络栈的工作机制.作为这一系列的第二篇文章,本文将在第一篇的基础上更进一步,主要探讨如何监视与网络相关的指标,从而识别背压等因素 ...
- Qt installer framework学习
一.官网的介绍部分网址 http://doc.qt.io/qtinstallerframework/ifw-overview.html 二.安装界面介绍 2.1 安装界面流程 介绍>>选择 ...
- zabbix 如何监控php-fpm?
zabbix监控php-fpm主要是通过nginx配置php-fpm的状态输出页面,在正则取值.要nginx能输出php-fpm的状态首先要先修改php-fpm的配置,没有开启nginx是没有法输出p ...
- python中API接口是什么
首先还是举个例子:你要去银行取钱的例子.如果没有银行柜员给你服务,你自己去存钱,你需要做的事情有: 一,打开金库的大门 二,把钱放进去 三,记账,存放了多少钱 四,离开. 问题解决了,但是其中有不少问 ...