java lang(Comparable接口) 和java util(Comparator接口)分析比较
//Comparable 接口强行对实现它的每个类的对象进行整体排序。 -- 自然排序。类的compareTo称为自然比较方法。
public interface Comparable<T> {
public int compareTo(T o);
}
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射(接口 java.util.SortedMap<K,V>)中的键或有序集合(接口 java.util.SortedSet<E>)中的元素,无需指定比较器(接口 java.util.Comparator<T>)。
compareTo 方法的返回值有三种情况:
- e1.compareTo(e2) > 0 即 e1 > e2
- e1.compareTo(e2) = 0 即 e1 = e2
- e1.compareTo(e2) < 0 即 e1 < e2
注意:
1.由于 null 不是一个类,也不是一个对象,因此在重写 compareTo 方法时应该注意 e.compareTo(null) 的情况,即使 e.equals(null) 返回 false,compareTo 方法也应该主动抛出一个空指针异常 NullPointerException。
2.Comparable 实现类重写 compareTo 方法时一般要求 e1.compareTo(e2) == 0 的结果要和 e1.equals(e2) 一致。这样将来使用 SortedSet 等根据类的自然排序进行排序的集合容器时可以保证保存的数据的顺序和想象中一致。
接口实现的例子:
import java.util.ArrayList;
import java.util.Collections; public class Car implements Comparable<Object>{
public String name;
public int price; public Car(String name, int price){
this.name = name;
this.price = price;
} public String toString() {
return this.name + ":" + this.price;
} @Override
public int compareTo(Object o) {
if ( o instanceof Car) {
Car car = (Car)o;
int result; result = this.price - car.price;
// 当car的price相同时,比较其name,按String的comparaTo()方法排序
if (result == 0) {
result = this.name.compareTo(car.name);
}
return result;
}
return 0;
} public static void main(String[] args) {
ArrayList<Car> all = new ArrayList<Car>();
all.add(new Car("兰博基尼", 400));
all.add(new Car("宝马", 100));
all.add(new Car("奔驰", 95));
all.add(new Car("法拉利", 300)); System.out.println(all);
Collections.sort(all);
System.out.println(all);
} }
打印出:
[兰博基尼:400, 宝马:100, 奔驰:95, 法拉利:300]
[奔驰:95, 宝马:100, 法拉利:300, 兰博基尼:400]
Comparator 比较器接口(策略设计模式)
我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么可以建立一个该类的比较器来排序,这个比较器只需要实现Comparator接口即可。
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
使用方式主要分三步:
1.创建一个 Comparator 接口的实现类,并赋值给一个对象在 compare 方法中针对自定义类写排序规则
2.将 Comparator 对象作为参数传递给 排序类的某个方法
3.向排序类中添加 compare 方法中使用的自定义类
接口操作例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; public class Car {
public String name;
public int price; public Car(String name, int price){
this.name = name;
this.price = price;
} public String toString() {
return this.name + ":" + this.price;
}
public static void main(String[] args) {
ArrayList<Car> all = new ArrayList<Car>();
all.add(new Car("兰博基尼", 400));
all.add(new Car("宝马", 100));
all.add(new Car("奔驰", 95));
all.add(new Car("法拉利", 300)); System.out.println(all);
Collections.sort(all, new MyComparator());
System.out.println(all); } } class MyComparator implements Comparator<Car> { @Override
public int compare(Car o1, Car o2) {
// TODO Auto-generated method stub
int result = o1.price - o2.price;
if ( result != 0) {
return result;
} else {
return o1.name.compareTo(o2.name);
}
} }
打印出:
[兰博基尼:400, 宝马:100, 奔驰:95, 法拉利:300]
[奔驰:95, 宝马:100, 法拉利:300, 兰博基尼:400]
Comparable 和 Comparator比较
Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。
而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。
我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”。
java lang(Comparable接口) 和java util(Comparator接口)分析比较的更多相关文章
- Java.lang.Comparable接口和Java.util.Comparator接口的区别
Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...
- java.lang.Comparable接口
转自:http://blog.csdn.net/zccst/article/details/5092920 java.lang.Comparable 接口 作者: zccst java.lang.Co ...
- Java基础 TreeSet()来实现数组的【定制排序】 : Comparable接口(自然排序) 或者 Comparator接口 (定制排序)
笔记: //排序真麻烦!没有C++里的好用又方便!ORZ!ORZ!数组排序还还自己写个TreeSet()和( Comparable接口(自然排序) 或者 Comparator接口 (定制排序))imp ...
- TreeMap cannot be cast to java.lang.Comparable
/** * Constructs a new, empty tree map, using the natural ordering of its * keys. All keys inserted ...
- Cannot be cast to java.lang.Comparable异常
Set集合中的treeSet问题:cannot be cast to java.lang.Comparable: 原理: Set不保存重复的元素,与Collection类似,只是行为不同,Set是基于 ...
- cannot be cast to java.lang.Comparable
Exception in thread "main" java.lang.ClassCastException: com.myradio.People cannot be cast ...
- Set集合中的treeSet问题:cannot be cast to java.lang.Comparable;
使用TreeSet保存自定义对象时, 必须让定义对象的类实现Comparable接口,并重写compareTo()方法 否则报 实体类User:cannot be cast to java.lang. ...
- java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager
问题: 使用Springboot打包为war部署于Tomcat7中报错 java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringMa ...
- maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
环境:Groovy/Grails Tool Suite 3.1.0.RELEASE(BASED ON ECLIPSE JUNO 3.8.1).JDK1.6.Maven3.05.Tomcat6 错误描述 ...
- maven web启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
问题描述 SEVERE: Error configuring application listener of class org.springframework.web.util.Log4jConfi ...
随机推荐
- 洛谷模拟NOIP考试反思
洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...
- 一个特别好用的属性:inline-block
说起inline-block,大家都不陌生,如果我要保证:有一个内联元素,保证它换行时,不被截断,而要整体换行,那么设置:display:inline-block 即可
- 【足迹C++primer】32、定制操作_2
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/32301839 定制操作_2 完整的big ...
- shallow clone
shallow clone 浅克隆经常在一些大型仓库中很有用——不用花费大量时间去clone一个完整的仓库,仅仅checkout出来某个分支(如master)的最新N次递交: git clone -- ...
- tensorflow中的name_scope, variable_scope
在训练深度网络时,为了减少需要训练参数的个数(比如LSTM模型),或者是多机多卡并行化训练大数据.大模型等情况时,往往就需要共享变量.另外一方面是当一个深度学习模型变得非常复杂的时候,往往存在大量的变 ...
- 自然语言处理之LDA主题模型
1.LDA概述 在机器学习领域,LDA是两个常用模型的简称:线性判别分析(Linear Discriminant Analysis)和 隐含狄利克雷分布(Latent Dirichlet Alloca ...
- hyperledge工具-cryptogen
参考:http://baijiahao.baidu.com/s?id=1596614770784685300&wfr=spider&for=pc cryptogen是Hyperledg ...
- [TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.实验器材 1.TPYboard V102板 一块 2.电机驱动模块L2 ...
- Java关键字(三)——static
我们说Java是一种面向对象编程的语言,而对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,对同类对象抽象出其共性,便是Java中的类,我们可以用类描述世间万物,也可以说万物皆对象.但是 ...
- UOJ236 IOI2016 Railroad 差分、欧拉回路、最小生成树
传送门 将"进入路段时速度\(\leq s_i\)"转换为:"进入路段时速度恰好等于\(s_i\),并且铺设铁轨有加速和减速两种,加速无需代价,减速每\(1 km/h\) ...