Java Compare接口
public interface Comparable<T> {
public int compareTo(T o);
}
一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果数组或者集合中的(类)元素实现了该接口的话 , 我们就可以调用 Collections.sort 和 Arrays.sort 排序,或应用于有序集合 TreeSet 和 TreeMap 中。
public class Test {
public static void main(String[] args) {
Person[] persons = {
new Person(10, "P1"), new Person(35, "P2"),
new Person(60, "P3"), new Person(10, "P4"),
new Person(40, "P5"), new Person(10, "P6") };
Person[] persons2 = persons;
Person[] persons3 = persons;
System.out.println("Before Sort:" + Arrays.toString(persons));
Arrays.sort(persons);
System.out.println("Arrays.sort:" + Arrays.toString(persons));
Collections.sort(Arrays.asList(persons2));
System.out.println("Collections.sort:" + Arrays.toString(persons2));
TreeSet<Person> set = new TreeSet<Person>();
TreeMap<Person, String> map = new TreeMap<Person, String>();
for(int i = 0; i < persons3.length; i++) {
set.add(persons3[i]);
map.put(persons3[i], "P" + (i + 1));
}
System.out.println("TreeSet:" + Arrays.toString(persons2));
System.out.println("TreeMap:" + Arrays.toString(persons2));
}
}
class Person implements Comparable<Person>{
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int compareTo(Person person) {
int cop = age - person.getAge();
return cop != 0 ? cop : name.compareTo(person.getName());
}
// 一般来说,一个类如果涉及到比较,应该重写equals()方法,因为内存地址比较没有意义。
public boolean equals(Object o) {
if(!(o instanceof Person))
return false;
Person person = (Person) o;
return (age == person.getAge()) && (name.equals(person.getName()));
}
// 覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个哈希码。
public int hashcode() {
int result = 17;
result = 37 * result + age;
result = 37 * result + name.hashCode();
return result;
}
public String toString() {
return age + "-" + name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
运行结果
Before Sort:[10-P1, 35-P2, 60-P3, 10-P4, 40-P5, 10-P6]
Arrays.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
Collections.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
TreeSet:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
TreeMap:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
二、 Comparator 接口
public interface Comparator<T> {
int compare(T o1, T o2);
}
Comparator 可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。Comparator的应用场景:
public class Test {
public static void main(String[] args) {
Person[] persons = {
new Person(10, "P1"), new Person(35, "P2"),
new Person(60, "P3"), new Person(10, "P4"),
new Person(40, "P5"), new Person(10, "P6") };
Person[] persons2 = persons;
System.out.println("Before Sort:" + Arrays.toString(persons));
Arrays.sort(persons, new PersonComparator());
System.out.println("Arrays.sort:" + Arrays.toString(persons));
Collections.sort(Arrays.asList(persons2), new PersonComparator());
System.out.println("Collections.sort:" + Arrays.toString(persons2));
}
}
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
int cop = p1.getAge() - p2.getAge();
return cop != 0 ? cop : p1.getName().compareTo(p2.getName());
}
}
运行结果
Before Sort:[10-P1, 35-P2, 60-P3, 10-P4, 40-P5, 10-P6]
Arrays.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
Collections.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
Java Compare接口的更多相关文章
- 比较器:Compare接口与Comparator接口区别与理解
一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: ...
- Java compare方法和compareTo方法
Java Comparator接口排序用法,详细介绍可以阅读这个链接的内容:https://www.cnblogs.com/shizhijie/p/7657049.html 对于 public int ...
- Java 函数式接口
目录 Java 函数式接口 1. 函数式接口 1.1 概念 1.2 格式 1.3 函数式接口的使用 2. 函数式编程 2.1 Lambda的延迟执行 性能浪费的日志案例 使用Lambda表达式的优化 ...
- 深入理解Java的接口和抽象类(转)
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- 深入理解Java的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- java微信接口之五—消息分组群发
一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...
- java微信接口之四—上传素材
一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...
- android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...
- [转载]深入理解JAVA的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
随机推荐
- ThinkPHP的URL模式
ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式.REWRITE和兼容模式. 一.PATHINFO模式 浏览器输入格式为: http://localhost/d ...
- 36-图像有用区(dfs, bfs)
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=92 图像有用区域 时间限制:3000 ms | 内存限制:65535 KB 难度:4 ...
- Windows系统 为 QT5软件 搭建 OpenCV2 开发环境
Windows系统 为 QT5软件 搭建 OpenCV2 开发环境 我们的电脑系统:Windows 10 64位 Qt5 软件:Qt 5. 7. 0 OpenCV2 版本:OpenCV2.4.10 1 ...
- 算法Sedgewick第四版-第1章基础-015一stack只保留last指针
/************************************************************************* * * A generic queue, impl ...
- R: 自定义函数
################################################### 问题:自定义函数 18.4.29 自定义函数,其返回值是个问题,还有怎么让过程变量成为全局变 ...
- C++面试笔记--指针和引用
面试一:指针与引用的区别? 答案: (1)非空区别.在任何情况下都不能使用指向空值的引用.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针 ...
- autoconf手册(一)
Autoconf Creating Automatic Configuration Scripts Edition 2.13, for Autoconf version 2.13 December 1 ...
- Service Fabric 群集在Service Replica过多的情况下报错问题
首先 Service Fabric 群集是正常的,部署一些服务过后也能正常运行,但一旦部署的服务过多后,且每个服务不止一个Partition,就有可能让群集状态为Error,但其实服务还是在正常运行的 ...
- 哈雷监控设备的操作及升级NSG9k6G
哈雷监控设备的操作及升级NSG9k6G 一.下载升级包: http://pan.baidu.com/s/1kTmw9sr 如连接不可以用可以直接私聊我.QQ1841031740 二.升级: 下载完后, ...
- 洛谷P3726 [AH2017/HNOI2017]抛硬币(组合数+扩展Lucas)
题面 传送门 题解 果然--扩展\(Lucas\)学了跟没学一样-- 我们先考虑\(a=b\)的情况,这种情况下每一个\(A\)胜的方案中\(A\)和\(B\)的所有位上一起取反一定是一个\(A\)败 ...