在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. 提示crontab command not found的解决方法

    操作步骤   1. 确认crontab是否安装:   执行 crontab 命令如果报 command not found,就表明没有安装   2. 安装 crontab   执行 yum insta ...

  2. HDU 6162 树链剖分

    题意:给你一颗树,每个节点有有一个权值,每次询问从x到y的最短路上权值在c到d之间的所有的点的权值和是多少. 思路:肯定要用树剖,因为询问c到d之间这种操作树上倍增很难做,但是用其它数据结构可以比较好 ...

  3. Tensorflow手写数字识别训练(梯度下降法)

    # coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #p ...

  4. 简单好用的General开发框架

    1.开篇概述 从2004年学习编程,2007年学习C#以来,做的多半都是跟数据库打交道的工作,所以也积累了很多数据库方面的知识,用过一些ORM框架,从了解掌握到自己实现,慢慢积累了很多代码,直到201 ...

  5. latex公式怎么变成图片格式

    由于这几天正在复习高中的数学,想写一些博客记录一下,发现数学公式的输入是一个问题,后来知道了latex,去youtube学习了一点入门教程发现挺简单的,不过有一个问题,latex生成的是pdf格式啊, ...

  6. 高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引

    一.聚集索引介绍 1.什么是聚集索引? InnoDB’s clustered indexes actually store a B-Tree index and the rows together i ...

  7. Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件

    一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...

  8. R: 用 R 查看、管理文件(夹)

    文件管理主要函数: list.files( ): 查看当前目录下文件. file.show( ): 显示文件. file.access( ): 查看文件是否可读可写. file.create( ): ...

  9. Django框架 之 URLconf

    Django框架 之 URLconf 浏览目录 URL 摘要 Django如何处理一个请求 反向解析URL name模式 namespace模式 一.URL 1.摘要 我们要在Django项目中为应用 ...

  10. fibnacci数列的两种实现(递归实现和循环实现)

    //一切尽在规律中,认真观察,你会明白更多... using System;using System.Collections.Generic;using System.Linq;using Syste ...