在Java集合框架中有两种比较接口: Comparable 接口和 Comparator 接口。
一、Comparable 接口 
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的应用场景:

  1 、如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序;
  2 、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。
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接口的更多相关文章

  1. 比较器:Compare接口与Comparator接口区别与理解

    一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: ...

  2. Java compare方法和compareTo方法

    Java Comparator接口排序用法,详细介绍可以阅读这个链接的内容:https://www.cnblogs.com/shizhijie/p/7657049.html 对于 public int ...

  3. Java 函数式接口

    目录 Java 函数式接口 1. 函数式接口 1.1 概念 1.2 格式 1.3 函数式接口的使用 2. 函数式编程 2.1 Lambda的延迟执行 性能浪费的日志案例 使用Lambda表达式的优化 ...

  4. 深入理解Java的接口和抽象类(转)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  5. 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  6. java微信接口之五—消息分组群发

    一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...

  7. java微信接口之四—上传素材

    一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...

  8. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

  9. [转载]深入理解JAVA的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

随机推荐

  1. IE双边距bug

    标准参考 根据 W3C CSS2.1 规范中的描述,对于非替换的浮动元素,若 'margin-left' 或 'margin-right' 特性的计算值为 'auto',则它们的实际使用值为 '0'. ...

  2. 前端JS面试题

    题目如下: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function ( ...

  3. Entity Framework Tutorial Basics(34):Table-Valued Function

    Table-Valued Function in Entity Framework 5.0 Entity Framework 5.0 supports Table-valued functions o ...

  4. 4. 内网渗透之IPC$入侵

    IPC$连接 IPC$的概念: IPC$(Internet Process Connection)是共享”命名管道”的资源,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限 ...

  5. Bootstrap 的 Collapse

    一.简介 Collapse 插件为 HTML 标签提供折叠.展开行为,依赖 transition.js(bootstrap.js 文件中已包含). 二.实现机制 实现 Collapse 效果需要: 一 ...

  6. [转载]Redhat Enterprise 6.1 如何使用免费的CentOS的yum源

    Redhat Enterprise 6.1 如何使用免费的CentOS的yum源 graybull posted @ 2013年2月18日 22:29 in Unix/Linux with tags  ...

  7. CHSaveData

    NSData数据 NSStream文件流 NSCache缓存 SQLite NSFileManager文件管理 NSUserDefaults数据存储 PList数据存储 NSKeyedArchiver ...

  8. html二

    超链接 超链接有三种形式: 1.外部链接:链接到外部文件.举例: <a href="new.html">点击进入到新网页</a> a是英语anchor“锚” ...

  9. P1556 幸福的路

    题意:平面内有N头牛$N\le 10$john从(0,0)出发,最后回到(0,0) 只有走到牛那里john才可以改变方向,否则沿着直线走 问john经过每一头牛并且在每一头牛出恰好改变方向一次的方案( ...

  10. 最短路【洛谷P3946】ことりのおやつ(小鸟的点心)

    P3946 ことりのおやつ(小鸟的点心) 滑完雪之后,ことり突然想吃点心啦!于是她去了甜品店. 日本的冬天经常下雪.不幸的是,今天也是这样,每秒钟雪的厚度会增加q毫米. 秋叶原共有n个地点,编号从1到 ...