Java-comparator & comparable
comparable
comparable 接口定义了 compareTo 方法,用于比较对象。java.lang。 假设要设计求两个相同类型的对象中较大者的通用方法。这里的对象可以是两个学生、两个日期、两个圆、两个矩形或者两个正方形。为了实现这个方法,两个对象必须是可比较的。因此!两个对象都该有的共同方法好就是comparable。
定义
Java提供了Comparable接口。定义如下:
package java.lang;
public interface Comparable<E> {
public int compareTo(E o);
}
使用方法
compareTo方法判断这个对象相对于给定对象o的顺序,并且当这个对象小于、等于或大于给定对象o时,分别返回负整数、0或正整数。
使用范围
Java库中许多类实现了Comparable接口以定义对象的自然顺序。
Byte, Short, Integer, Long, Float, Double, Character, BigInteger, BigDecimal, Calendar, String, Date.
可以具体看一下Integer中的定义:
public class Integer extends Number implements Comparable<Integer> {
@override
public int compareTo(Integer o) {
}
}
具体例子
comparable 和 sort
Java API中的java.util.Arrays.sort(Object[])方法就是可以使用compareTo方法对数组中的对象进行比较和排序。
那么如果没有实现接口Comparable想用sort肿么办??? 答曰:可以定义一个新类继承(扩展)自原类并继承Comparable接口
小贴士
尽量使compareTo方法与Object类中的equals方法结果一致,虽然现在对object类是否应该compareTo方法尚有争论。
Comparator接口
对于没有实现Comparable的类的对象,我们可以定义一个比较器comparator,java.util.Comparator
,来比较**不同类的元素**。
定义
public int compare(T element1, T element2)
如果element1 < element2,返回一个负值;element1 == element2,返回 0; element1 > element2, 返回一个正值。
我们可以通过重写compare方法来实现比较。
具体例子
定义一个比较器类。 GeometricObjectComparator被创建并传递给max方法,程序第17行max方法使用了比较器。
Comparable & Comparator
- 狂妄地一言以蔽之: comparable是类中不同对象的比较,comparator是类间比较。打个比方: comparable 用来比较矩形1和矩形2的面积,comparator用来比较矩形1和圆1的面积。
- 如果比较的方法只要用在一个类中,用该类实现Comparable接口就可以。 如果比较的方法在很多类中需要用到,就自己写个类实现Comparator接口,这样当要比较的时候把实现了Comparator接口的类传过去就可以,省得重复造轮子。这也是为什么Comparator会在java.util包下的原因。 使用Comparator的优点是:1.与实体类分离 2.方便应对多变的排序规则