Java中的两种比较器(内部比较器Comparable和外部比较器Comparator)

内部比较器
  • 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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值