Java集合(一)--Comparable和Comparator
Comparable:
是集合内部的方法实现的排序,只有一个方法
public interface Comparable<T> {
public int compareTo(T o);
}
对于String和一些基本数据类型,默认实现了Comparable 接口,实现了compareTo方法,可以直接使用。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value; int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
} public final class Integer extends Number implements Comparable<Integer> {
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
}
使用场景:
同一个类的两个对象相互比较,类内部的比较
可以进行排序,但是一定要实现Comparable,否则出现异常
Collections.sort()和Arrays.sort()内部都有应用
使用样例:
@Slf4j
@Data
@AllArgsConstructor
public class TestUnit implements Comparable<TestUnit>{ private String name;
private Integer age; @Override
public int compareTo(TestUnit o) {
return this.age.compareTo(o.age);
} public static void main(String[] args) {
List<TestUnit> list = new ArrayList<TestUnit>();
list.add(new TestUnit("a",2));
list.add(new TestUnit("b",1));
list.add(new TestUnit("c",3));
System.out.println(list);
Collections.sort(list);
System.out.println(list);
TestUnit unit = new TestUnit("a", 1);
TestUnit unit1 = new TestUnit("b", 2);
System.out.println(unit.compareTo(unit1));
} }
结果:
[TestUnit(name=a, age=2), TestUnit(name=b, age=1), TestUnit(name=c, age=3)]
[TestUnit(name=b, age=1), TestUnit(name=a, age=2), TestUnit(name=c, age=3)]
-1
Comparator:
是集合外部的方法实现的排序,多个方法
public interface Comparator<T> {
int compare(T o1, T o2);
public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));
}
}
使用场景:
Comparator接口代码更加灵活,可以定义某个类的多个比较器,以满足不用的需求,而不改变对象自身,而用一个策略对象来改变对象的比较
行为(策略模式)。
使用样例:
@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestUnit implements Comparator<TestUnit> { private String name;
private Integer age; public static void main(String[] args) {
List<TestUnit> list = new ArrayList<TestUnit>();
list.add(new TestUnit("a",2));
list.add(new TestUnit("b",1));
list.add(new TestUnit("c",3));
System.out.println(list);
Collections.sort(list, new TestUnit());
System.out.println(list); TestUnit unit = new TestUnit("a", 1);
TestUnit unit1 = new TestUnit("b", 2);
System.out.println(unit.compare(unit, unit1));;
} @Override
public int compare(TestUnit o1, TestUnit o2) {
return o1.age - o2.age;
}
}
结果:
[TestUnit(name=a, age=2), TestUnit(name=b, age=1), TestUnit(name=c, age=3)]
[TestUnit(name=b, age=1), TestUnit(name=a, age=2), TestUnit(name=c, age=3)]
-1
注意事项:
无论是Comparable还是Comparator实现类在重写compareTo、compare方法时,一般要求compare(o1,o2))==0的逻辑结果要和o1.equals(o2)
保持一致。
总结:
(1)如果比较的方法只用在一个类中,则该类实现Comparable接口就可以
(2)如果比较的方法在很多类中需要用到,就自己写个类实现Comparator接口,实现松耦合
(3)在用Collections类的sort方法排序时,若不指定Comparator,那就以自然顺序排序(自然顺序就是实现Comparable接口设定的排序方式)
参考:https://mp.weixin.qq.com/s/GBJf5eHxhoUwlpm0BB1jpA
Java集合(一)--Comparable和Comparator的更多相关文章
- Java基础系列-Comparable和Comparator
原创文章,转载请标注出处:<Java基础系列-Comparable和Comparator> 一.概述 Java中的排序是由Comparable和Comparator这两个接 ...
- Java基础之Comparable与Comparator
Java基础之Comparable与Comparator 一.前言: Java中实现对对象的排序一般情况下主要有以下两种实现方式(万物皆对象嘛): 对象所在的类实现Comparable 接口 定义比较 ...
- Java学习之Comparable与Comparator的区别
Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序 ...
- java比较排序Comparable和Comparator
1 比较排序Comparable和Comparator 1.1 接口作用说明 Comparable和Comparator都是用来实现对象的比较.排序,对比时需要实现Compara ...
- java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator
Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...
- 【软件构造】(转)Java中的comparable和comparator
为了方便阅读和复习,转载至此,原地址:温布利往事的博客 阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Co ...
- 集合排序Comparable和Comparator有什么区别?
Comparable和Comparator兄弟俩长得是真像.但是,需要注意下,使用中它们还是有不少区别的.下面,就一探究竟吧. 一.Comparator 做过集合排序的童鞋应该知道,可以使用Colle ...
- Java的比较器Comparable与Comparator
在Java中有两个比较器:Comparable.Comparator 对于Integer.Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序 ...
- 来吧,一文彻底搞懂Java中的Comparable和Comparator
大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...
随机推荐
- NYOJ 496 [巡回赛-拓扑排序]
链接:click here 题意: 巡回赛 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 世界拳击协会(WBA)是历史最悠久的世界性拳击组织,孕育了众多的世界冠军, ...
- Vim i和a差别
i是当前位置插入 a是当前文字的后面插入
- hdu 4990 Reading comprehension(等比数列法)
题目链接:pid=4990" style="color:rgb(255,153,0); text-decoration:none; font-family:Arial; line- ...
- 学习Flash Builder编程的准备工作
1. 下载教科书,Essential ActionScript 3.0或者Programming ActionScript 3.0.这将是你的很好的老师.英语不灵的买一本中文版本. 2. 安装Flas ...
- 1章 SpringBoot介绍
新建一个SpringBoot版的Hello World.
- Eclipse出现Class Not Found异常时可以参考我所知道的一个方案
如过你出现Class Not Found异常,可以参考以下这个解决方案 打开Properties for projectName面板-->Deploment Assembly--:查看有没有缺失 ...
- P3402 【模板】可持久化并查集
传送门 //minamoto #include<bits/stdc++.h> using namespace std; #define getc() (p1==p2&&(p ...
- Django day 36 支付宝支付,微信推送
一:支付宝支付, 二:微信推送
- 微服务下,使用ELK做日志收集及分析
一.使用背景 目前项目中,采用的是微服务框架,对于日志,采用的是logback的配置,每个微服务的日志,都是通过File的方式存储在部署的机器上,但是由于日志比较分散,想要检查各个微服务是否有报错信息 ...
- RandomAccessFile使用场景及总结
大家在学到Java中IO流的时候学到了各种流,对文件的各种操作.但是唯独可能对RandomAccessFile对象不会去过多的研究,那么这个到底有什么用呢? RandomAccessFile的唯一父类 ...