深入理解Collections API
http://tech.ddvip.com 2006年11月24日 社区交流
本文详细介绍深入理解Collections API
compare 方法比较它的两个参数,当第一个参数小于、等于或大于第二个参数时,分别返回一个负整数、空或正整数。如果其中一个参数具有对 Comparator 不适合的类型,compare 方法则扔出一个 ClassCastException。
在上一节中的有关 Comparable 的许多内容也适用Comparator。编写一个 compare 方法几乎等同于编写一个compareTo 方法,除前者是把两个参数都当作参数之外。compare 方法必须象Comparable 的 compareTo 方法一样,服从同样的四个"技术限制"。出于同样的原因, Comparator 必须对它所比较的对象诱发一个 partial order(部分顺序)。
假设你有一个称作 EmployeeRecord 的类:
public class EmployeeRecord implements Comparable { public Name name(); public int employeeNumber(); public Date hireDate(); ...}我们假设 EmployeeRecord 对象的自然排序是对雇员姓名的排序 (就象上一个例子中所定义的)。不幸的是,老板要求我们提出一个按雇员资历排序的列表。这就意味着我们必须做些额外的工作,但是不多。以下是一个将生成所需列表的程序:
import java.util.*;class EmpSort { static final Comparator SENIORITY_ORDER = new Comparator() { public int compare(Object o1, Object o2) { EmployeeRecord r1 = (EmployeeRecord) o1; EmployeeRecord r2 = (EmployeeRecord) o2; return r2.hireDate().compareTo(r1.hireDate()); } }; static final Collection employees = ... ; // Employee Database public static void main(String args[]) { List emp = new ArrayList(employees); Collections.sort(emp, SENIORITY_ORDER); System.out.println(emp); }}以上程序中的 Comparator 相当简单。它将它的参数转换为EmployeeRecord, 并依赖适用于 hireDate()方法的 Date 的自然排序。请注意:Comparator 将它的第二个参数的雇用-日期传递给第一个参数,而不是按反方向传递。 这是因为,最新雇用的雇员资历最浅:按照雇用-日期排序将使列表成为反向资历-顺序。另一个获得相同结果的方法是:保持参数顺序,但对比较结果求反。
责编:豆豆技术应用
正在加载评论...