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代表一个 ...
随机推荐
- mysql5.5升级到5.7
一.首先把mysql服务停止,复制mysql5.5中的data文件夹中的内容(你需要的数据库),放在mysql5.7的data文件夹中; 二.启动切换mysql5.7版本,(我这用的是phpwamp, ...
- c++ 面试题(海量数据篇)
1,在海量数据中找中位数: 题目如下: 只有2G内存的pc机,在一个存有10G个整数的文件,从中找到中位数,写一个算法. 解答:http://www.cnblogs.com/youxin/archiv ...
- python的基本用法(三)字符串常用函数
字符串常用函数 # s='.abcd.'# new_s=s.strip('.')#默认去掉字符串两边的空格和换行符,想去掉什么括号中就写什么# print('s',s)# print('new_s', ...
- node.js中express使用cookie-parser 和 cookie-session处理会话
cookie-parser 中间件用来解析客户端传过来的cookie,cookie-session 中间件用来建立基于cookie的会话session. 一.安装 cookie-parser 和 co ...
- win10系统配置jdk环境不能用%JAVA_HOME% 代替目录
发现以前配好的java环境变量和tomcat环境变量全都清空了,在重新配置的时候总是出现问题,即在cmd命令窗口下,输入java,显示正常,输入java -version 也是显示正常,唯独输入jav ...
- Asterisk 11 chan_sip.c: Failed to authenticate device 看不到IP的问题
Asterisk 11 chan_sip.c: Failed to authenticate device 看不到IP的问题 没有验证过 原文地址 http://www.coochey.net/? ...
- C#当中的扩展方法
先说有用的,c#扩展方法结论: 扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型.扩展方法必须是静态方法,可以像实例方法一样进行调用.且调用同名中实际定义的 ...
- Java程序员职业生涯规划完整版:从程序员到CTO( 摘)
在技巧方面无论我们怎么学习,总感觉需要晋升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高等特性 反射.泛型. ...
- MySQL缓存参数优化(转)
MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在 ...
- h5移动网页唤起App
最近这个困惑了很久,不断的有一些坑,目前还有疑问关于iOS唤起无效时会出现弹框的问题,这个最后再说 1.首先可能需要判断当前浏览器的来源(目前开发的App还没有上架,所以针对腾讯出品的大家广为人知的微 ...