public interface Comparable { public int compareTo(Object o); }
compareTo 方法将接收对象与特定对象进行比较,并在接收对象小于、等于或大于特定对象时分别返回负整数、空或一个正整数。假如特定对象不能与接收对象相比较,该方法扔出一个ClassCastException. 这是一个表示某人姓名的类(a class rePResenting a person"s name), 它实现了 Comparable: import java.util.*;
public class Name implements Comparable { private String firstName, lastName;
public Name(String firstName, String lastName) { if (firstName==null lastName==null) throw new NullPointerException(); this.firstName = firstName; this.lastName = lastName; } public String firstName() {return firstName;} public String lastName() {return lastName;}
public boolean equals(Object o) { if (!(o instanceof Name)) return false; Name n = (Name)o; return n.firstName.equals(firstName) && n.lastName.equals(lastName); }
public int hashCode() { return 31*firstName.hashCode() + lastName.hashCode(); }
public String toString() {return firstName + " " + lastName;}
public int compareTo(Object o) { Name n = (Name)o; int lastCmp = lastName.compareTo(n.lastName); return (lastCmp!=0 ? lastCmp : firstName.compareTo(n.firstName)); } } QQRead.com 推出数据恢复指南教程 数据恢复指南教程 数据恢复故障解析 常用数据恢复方案 硬盘数据恢复教程 数据保护方法 数据恢复软件 专业数据恢复服务指南 为了使这个例子短一些,该类受到了一点限制:它不支持中间名,它要求必须同时具有first name 和 last name, 而这不是在全世界都通用的。尽管如此,这个例子仍有几个重要之处: Name 对象是不变的( immutable)。作为相等、不变类型的所有其它事情就是如何做的问题,非凡是对那些将被用来作为 Sets 中的元素或 Maps 中的键的对象来说,更是如此。假如你对这些 对象集 中的元素或键做了更改,这些 对象集 将中断。
由于这一节介绍的是有关元素排序的问题,因而让我们稍微多谈一点 Name 的 compareTo 方法。它实现标准的姓名-排序算法,在该算法中,last name 优先于 first name。这恰恰是你在一个natural ordering(自然排序)中所想要的。 假如自然排序不自然,那才轻易引起混乱呢!