Comparable接口和Comparator接口的不同用法
两者都可用来在定义比较方法,然后用在排序中。
Comparable是类本身继承的接口
Comparator实在类外定义一个排序的类
比较而言,觉得Comparator更灵活一些,但是Comparable方便一些。
举个栗子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; public class Main { public static void main(String[] args) {
ArrayList<Pair> list = new ArrayList<>();
list.add(new Pair(8, 1));
list.add(new Pair(6, 5));
list.add(new Pair(6, 3));
list.add(new Pair(5, 7));
list.add(new Pair(4, 9));
// 用Comparator排序 -- 按照两个数的和排序
list.sort(new PairComparator());
for (Pair p: list)
System.out.println(p);
System.out.println();
// 用Comparable排序 -- 先按第一个数排序 再按第二个数排序
Collections.sort(list);
for (Pair p: list)
System.out.println(p);
}
} class PairComparator implements Comparator<Pair> { @Override
public int compare(Pair p1, Pair p2) {
int sum1 = p1.getSum();
int sum2 = p2.getSum();
return (sum1 == sum2 ? 0 : (sum1 < sum2 ? -1 : 1));
} } class Pair implements Comparable<Pair> { private int first;
private int second; public Pair(int first, int second) {
this.first = first;
this.second = second;
} @Override
public int compareTo(Pair p) {
if (first == p.first) {
if (second == p.second) return 0;
return second < p.second ? -1 : 1;
}
return first < p.first ? -1 : 1;
} public int getSum() {
return first + second;
} public String toString() {
return "[first:" + first + ", second:" + second + ", sum:" + getSum() + "]";
} }
输出:
[first:8, second:1, sum:9]
[first:6, second:3, sum:9]
[first:6, second:5, sum:11]
[first:5, second:7, sum:12]
[first:4, second:9, sum:13] [first:4, second:9, sum:13]
[first:5, second:7, sum:12]
[first:6, second:3, sum:9]
[first:6, second:5, sum:11]
[first:8, second:1, sum:9]
对于一些已经写好的类,比如String,我们当然不能去修改它的compareTo()方法,于是可以写一个自定义的比较器。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("abcd");
list.add("bcd");
list.add("cd");
list.add("d");
Collections.sort(list);
System.out.println(list);
list.sort(new MyStringComparator());
System.out.println(list);
}
} // 自定义的String排序方法 按字符串长度排序
class MyStringComparator implements Comparator<String> { @Override
public int compare(String o1, String o2) {
int len1 = o1.length();
int len2 = o2.length();
return (len1 == len2 ? 0 : (len1 < len2 ? -1 : 1));
} }
输出:
[abcd, bcd, cd, d]
[d, cd, bcd, abcd]
Comparable接口和Comparator接口的不同用法的更多相关文章
- Java—集合框架 Collections.sort()、Comparable接口和Comparator接口
Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...
- Java中实现对象的比较:Comparable接口和Comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Comparable接口与Comparator接口的比较————总结
之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都 ...
- 比较器:Compare接口与Comparator接口区别与理解
一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: ...
- java中Comparatable接口和Comparator接口的区别
1.不同类型的排序规则 .自然排序是什么? 自然排序是一种升序排序.对于不同的数据类型,升序规则不一样: BigDecimal BigInteger Byte Double Float Int ...
- Comparatable接口和Comparator接口的使用与区别
这篇博文可以为你解决的问题如下: 什么是自然排序 Collections.sort()与Arrays.sort()的异同点 Comparatable接口和Comparator接口各自的排序依据(理论讲 ...
- Java中Comparable接口和Comparator接口的简单用法
对象比较器 1.Comparable接口 此接口强行对实现它的每个类的对象进行整体排序,这种排序成为类的自然排序,类的compareTo方法称为类的自然比较方法. 代码示例 import java.u ...
- Java中的Comparable接口和Comparator接口
Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...
随机推荐
- 新建jsp项目
选择 下面类型
- Python设计模式 - UML - 组件图(Component Diagram)
简介 组件图又称构建图,用于显示系统各组件及各组件关系的物理视图. 组件图通常包括组件.接口.关系.端口和连接器,用来显示程序代码中相应的模块.源文件或源文件集合之间的依赖和泛化关系. 组件图中的组件 ...
- Codeforces Round #508 (Div. 2)
Codeforces Round #508 (Div. 2) http://codeforces.com/contest/1038 A #include<bits/stdc++.h> us ...
- python数据类型分类
python数据分为可变类型和不可变类型,其中:可变类型:列表,字典不可变类型:布尔值,数字,字符串,元组 specidal:集合作为set是可变的,而作为frozenset是不可变集合 可变类型和不 ...
- HDU 5828 Rikka with Sequence(线段树区间加开根求和)
Problem DescriptionAs we know, Rikka is poor at math. Yuta is worrying about this situation, so he g ...
- 微信小程序记账本进度二
二.1,下载微信web开发者工具 2,使用新注册的账号登录,并创建工程
- convert 函数的使用
先说问题:今天项目中很多模块出现了一个集体性的问题,时间检索时选择同一天 检索不出数据(表中数据确实存在),其实这个问题在做东西的时候领导说过,记忆中我解决了,但是后来写代码可能把这个问题忘记了! 其 ...
- 设计模式学习心得<单利模式 Singleton>
概述 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 主要解决 一个全局使用的类频繁地创建与销毁. 何时使用 当您想控制实例数目,节省系统资源的时候. 如何解决 判断系统是否已经有这个单 ...
- cpp 区块链模拟示例(二)工程代码解析
/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ window ...
- PHP脚本命令行执行成功,CRON无法执行故障解决记录
先来看看一个最简单的PHP文件(ip.php) <?php $myip = get_ip_cmd(); echo($myip); // get ip address function get_i ...