内部比较器
- java.lang.Comparable <T> 接口声明了:int compareTo(T o) 方法。此方法可以为自定义类添加可比较属性。实现了Comparable接口后,就意味着“该类支持排序”。假设现在存在“实现了Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过Collections.sort(或Arrays.sort)进行排序。
- Comparable 定义
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
- 实现该接口的类必须实现该方法,实现后,对象就可以比较大小。根据返回值的不同,可以实现升序或降序排列。
- Java的一些常用类已经实现了Comparable接口,并提供了比较大小的标准。Integer,Long,Double等包装类按照它们对应的数值的大小进行比较。Character,Boolean,String,Data,Time等也都实现了Comparable接口。
外部比较器
- 若是想要对某个类的对象集合进行排序,而该类本身不支持排序(即没有实现Comparable接口);那么可以建立一个“该类的比较器”来对这个类的对象进行排序,这个“比较器”只需要实现Comparator接口即可。
- Comparator接口定义:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
- 若一个类要实现Comparator接口,则一定要实现compare(T o1,T o2)函数,但可以不实现equals(Object obj)函数。Object类是所有类的父类,即实现接口的子类已经重写了equals方法。
- int compare(T o1,T o2) 可以根据返回值的不同实现升序或降序排列。
优先队列的应用讲解两种方法的实现
(一)内部比较器
static class Node implements Comparable{
int node;
int distance;
public Node(int node,int distance) {
this.node=node;
this.distance=distance;
}
@Override
public int compareTo(Object o) {
return this.distance-((Node)o).distance;
}
}
Queue<Node> priorityQueue = new PriorityQueue<Node>();
(二)外部比较器
static class Node{
int node;
int distance;
public Node(int node,int distance) {
this.node=node;
this.distance=distance;
}
}
class NodeComparator implements Comparator<Node>{
@Override
public int compare(Node o1, Node o2) {
return o1.distance-o2.distance;
}
}
Queue<Node> priorityQueue = new PriorityQueue<Node>(new NodeComparator());
最后总结
- Comparable 是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
- Comparator是比较器;若需要控制某个类的对象集合的次序,可以自定义一个“该类的对象的比较器”来进行排序。
参考来源
内部比较器Comparable和外部比较器Comparator