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的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
随机推荐
- mongodb 降序
降序排序 db.mycol.find({},{,_id:}).sort({})// 1用于升序排列,而-1用于降序. 示例代码: var user = await Kitten.find({ type ...
- #pragma pack()用法详解
博客转载自:http://blog.csdn.net/lime1991/article/details/44536343 1.什么是对齐?为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从 ...
- Halcon从某一个图片以指定区域绘制到另一个图像
************************************************************* * Halcon从某一个图片以指定区域绘制到另一个图像 * Author: ...
- Luogu 3233 [HNOI2014]世界树
BZOJ 3572 首先看出虚树,然后考虑如何$dp$. 我们先在处理出的虚树上$dp$一遍,处理出虚树上所有点距离最近的关键点(关键点一定在虚树上嘛). 具体来说,先搜一遍处理出每一个点的父亲到它的 ...
- 第三章:PCL基础3.1
架构师为了确保在PCL中所有代码风格的一致性,使得其他开发者及用户容易理解源码,PCL开发者制定并遵循着一套严格的编写规范,PCL的开发者都默认此规范. 3.1PCL推荐的命名规范 1.文件命名 1) ...
- c语言中会遇到的面试题
预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 ...
- 函数的返回值是如何带出和接收的以及内存中的活动情况.RP
函数返回值时,要生成一个值的副本. 而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** ...
- LVM扩展学习日志
lvm是逻辑卷管理的简称,它将一个或多个物理硬盘分区(PV)组成一个逻辑硬盘(VG)来使用, 然后从这个VG中划分出逻辑分区(LV), 以上概念是我理解的东西,可能和书上的不一样. 以下所有命令都是 ...
- Android ExpandableListView的使用
一.MainActivity要继承ExpandableListActivity.效果是当单击ListView的子项是显示另一个ListView. package com.example.explear ...
- 使用metasploit进行栈溢出攻击-3
有了shellcode,就可以进行攻击了,但是要有漏洞才行,真实世界中的漏洞很复杂,并且很难发现,因此我专门做一个漏洞来进行攻击. 具体来说就是做一个简单的tcp server,里面包含明显的栈溢出漏 ...