Comparable接口与Comparator接口的比较————Comparable接口详解
Comparable接口位于:java.lang包中。
Comparable接口:
1. 实现了这个接口的类,会被强制进行自然排序。
问题又来了:那什么是自然排序呢?
自然排序:就是字典序排序,不分大小写。例如:a、A都排在b、B之前。
做个简单的测试吧:
现在有个需求,需要让你把用户进行自然排序。So,亲爱的小伙伴们,这应该
怎么做呢?
思路:创建一个用户类(User),且此类实现了Comparable接口,然后进行测试。
记住了呦:
Collections.sort();可以对列表进行排序。
Arrays.sort();可以对数组进行排序哦。
嘿嘿,Let's do a test!
下面是User类的代码:
package test;
public class User implements Comparable<User>{
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
/*
* 先比较name,
* 大于,返回1
* 等于,接着比较age
* age:大于,返回1
* 等于,返回0
* 小于,返回-1
* 小于:返回-1
* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(User o) {
int flag = 0;
flag = this.getName().compareTo(o.getName());
if(flag == 0) {
flag = this.getAge().compareTo(o.getAge());
return flag;
}else {
return flag;
}
}
}
下面是做测试的代码UserTest:
package test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; public class UserTest { public static void print(List<User> list) {
for(User u : list) {
System.out.println(u);
}
} public static void print(User[] array) {
for(int i=0; i<array.length; i++) {
System.out.println(array[i]);
}
} public static void main(String[] args) { List<User> users = new ArrayList<User>();
users.add(new User("a",12));
users.add(new User("C",25));
users.add(new User("B",12));
users.add(new User("A",15));
users.add(new User("b",19));
users.add(new User("c",17));
users.add(new User("a",22)); System.out.println("排序前:");
print(users); System.out.println();
System.out.println(); System.out.println("排序后:");
Collections.sort(users);
print(users); User[] users2 = new User[]{
new User("a",12),
new User("C",25),
new User("B",12),
new User("A",15),
new User("b",19),
new User("c",17),
new User("a",22)
}; System.out.println("排序前:");
print(users2); System.out.println();
System.out.println(); System.out.println("排序后:");
Arrays.sort(users2);
print(users2);
} }
小伙伴们想一下,程序运行的结果应该是什么?
哈哈,结果应该是:
A 15
B 12
C 25
a 12
a 22
b 19
c 17
可能有的小伙伴想的是:
a 12
A 15
a 22
B 12
b 19
c 17
C 25
嘿嘿,上面的结果,也是我第一次考虑出的结果,程序运行后得到并不一样怎么办?哪里有错呢?看了几遍,感觉命名没错哈?!No, 还是有错,并不是代码有错哦,而是你出错了!
嘿嘿,请小伙伴仔细看User中的compareTo方法:
在compareTo方法中的第二行:flag = this.getName().compareTo(o.getName()); 这句话就是罪魁祸首,还真是可恶啊!!!该死,嘻嘻!
有没有小伙伴看出什么的呢?
好啦,flag = this.getName().compareTo(o.getName());这句话中也有compareTo方法,在api中找到String的compareTo(String)方法,小编发现了一个重大新闻、重大新闻、重大新闻!!!
重要的事情说三遍:String的compareTo(String)方法中有这个说明:
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
这意味着什么呢?意味着:字符串的排序虽是字典顺序排序,但是大小写有分别。A的Unicode值在a的Unicode前面,所以A排在a的前面咯。
所以这个问题就解决了。
String的compareTo(String)方法的下面,还有一个让小编看了特兴奋的方法!!!是什么呢?哈哈,是compareToIgnoreCase(String)方法啦。
从方法的名字就能理解:使用这个方法进行比较字符串时,忽略、忽略、忽略大小写,哈哈!!!
当然,这只是小编的猜想,具体是什么作用?还是得看实际的结果对吧!测试的结果如下:
User [name=a, age=12]
User [name=A, age=15]
User [name=a, age=22]
User [name=B, age=12]
User [name=b, age=19]
User [name=c, age=17]
User [name=C, age=25]
是不是和之前的猜想一样呢!哈哈,今天Comparable接口就到这里了,ByeBye!!!
Comparable接口与Comparator接口的比较————Comparable接口详解的更多相关文章
- Mybatis中接口和对应的mapper文件位置配置详解
Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...
- Java基础学习(四)-- 接口、集合框架、Collection、泛型详解
接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写. 二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...
- 【高速接口-RapidIO】4、Xilinx RapidIO核详解
一.RapidIO核概述 RapidIO核的设计标准来源于RapidIO Interconnect Specification rev2.2,它支持1x,2x和4x三种模式,每通道的速度支持1.25G ...
- mybatis中的mapper接口文件以及selectByExample类的实例函数详解
记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...
- java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)
简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...
- Java中的Comparable<T>和Comparator<T>接口
有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别). 1) 在使用普通数组的时候,如果想对数据进行排序 ...
- Java中实现对象的比较:Comparable接口和Comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...
随机推荐
- BZOJ 1257 余数之和 题解
题面 这道题是一道整除分块的模板题: 首先,知道分块的人应该知道,n/i最多有2*sqrt(n)种数,但这和余数有什么关系呢? 注意,只要n/i的值和n/(i+d)的值一样,那么n%i到n%(i+d) ...
- rust学习小记(1)
本文的学习资料来自 Rust 程序设计语言 简体中文版 推荐用idea来写rust,装好插件rust和toml即可 cargo(包管理) 可以使用 cargo build 或 cargo check ...
- 刷机,twrp,安装xposed
首先明白几个名词: recovery模式,类似于pc端的PE系统,每个手机都有自带的rec,但不好用,最好自己刷一个,现在市面最好用的是twrp fastboot模式,比recovery更底层,进入f ...
- C++中的数据类模板
1,预备知识: 1,模板参数可以是数值型参数(非类型参数): 1,代码示例: template <typename T, int N> void func() { T a[N]; // 使 ...
- PythonDay11
第十一章函数使用_迭代器 今日内容 函数名的第一类对象及使用 f-strings 迭代器 函数名的第一类对象及使用 函数名可以当做值,赋值给变量 函数名可以当做容器内的元素 函数名可以当做函数的参数 ...
- 安装运行zookeeper的坑
从官网下载zookeeper的地址中有俩文件 一个是apache-zookeeper-3.5.5.tar.gz ,另一个是apache-zookeeper-3.5.5-bin.tar.gz 若是使用前 ...
- 浏览器给openresty连接发送参数请求,查询数据库,并返回json数据
nginx.conf配置文件 #user nobody; worker_processes 1; error_log logs/error.log; #error_log logs/error.log ...
- C#获取局域网主机
C#获取局域网主机 最近在做一个使用MSRDPClient来实现远程桌面功能,需要先判断一下该局域网主机是否在线,所以就需要获取一遍局域网主机. 首先获取本地IP地址,这里需要注意的是,要排除掉虚拟机 ...
- RGB颜色值转换成十六进制
function transferRgbToStr(color) { if (typeof color !== 'string' && !(color instanceof Strin ...
- php通过反射方法调用私有方法
PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...