對(duì)這兩種方法來說,lhs代表本次比較中的“左手”對(duì)象,而rhs代表“右手”對(duì)象。 可創(chuàng)建Vector的一個(gè)子類,通過Compare實(shí)現(xiàn)“快速排序”。對(duì)于這種算法,包括它的速度以及原理等等,在此不具體說明。欲知詳情,可參考Binstock和Rex編著的《PRactical Algorithms for Programmers》,由Addison-Wesley于1995年出版。
public class StringSortTest { static class StringCompare implements Compare { public boolean lessThan(Object l, Object r) { return ((String)l).toLowerCase().compareTo( ((String)r).toLowerCase()) < 0; } public boolean lessThanOrEqual(Object l, Object r) { return ((String)l).toLowerCase().compareTo( ((String)r).toLowerCase()) <= 0; } } public static void main(String[] args) { SortVector sv = new SortVector(new StringCompare()); sv.addElement("d"); sv.addElement("A"); sv.addElement("C"); sv.addElement("c"); sv.addElement("b"); sv.addElement("B"); sv.addElement("D"); sv.addElement("a"); sv.sort(); Enumeration e = sv.elements(); while(e.hasMoreElements()) System.out.println(e.nextElement()); } } ///:~
內(nèi)部類是“靜態(tài)”(Static)的,因?yàn)樗阈柽B接一個(gè)外部類即可工作。 大家可以看到,一旦設(shè)置好框架,就可以非常方便地重復(fù)使用象這樣的一個(gè)設(shè)計(jì)——只需簡單地寫一個(gè)類,將“需要發(fā)生變化”的東西封裝進(jìn)去,然后將一個(gè)對(duì)象傳給SortVector即可。 比較時(shí)將字串強(qiáng)制為小寫形式,所以大寫A會(huì)排列于小寫a的旁邊,而不會(huì)移動(dòng)一個(gè)完全不同的地方。然而,該例也顯示了這種方法的一個(gè)不足,因?yàn)樯鲜鰷y(cè)試代碼按照出現(xiàn)順序排列同一個(gè)字母的大寫和小寫形式:A a b B c C d D。但這通常不是一個(gè)大問題,因?yàn)榻?jīng)常處理的都是更長的字串,所以上述效果不會(huì)顯露出來(Java 1.2的集合提供了排序功能,已解決了這個(gè)問題)。 繼續(xù)(extends)在這兒用于創(chuàng)建一種新類型的Vector——也就是說,SortVector屬于一種Vector,并帶有一些附加的功能。繼續(xù)在這里可發(fā)揮很大的作用,但了帶來了問題。它使一些方法具有了final屬性(已在第7章講述),所以不能覆蓋它們。假如想創(chuàng)建一個(gè)排好序的Vector,令其只接收和生成String對(duì)象,就會(huì)碰到麻煩。因?yàn)閍ddElement()和elementAt()都具有final屬性,而且它們都是我們必須覆蓋的方法,否則便無法實(shí)現(xiàn)只能接收和產(chǎn)生String對(duì)象。 但在另一方面,請(qǐng)考慮采用“合成”方法:將一個(gè)對(duì)象置入一個(gè)新類的內(nèi)部。此時(shí),不是改寫上述代碼來達(dá)到這個(gè)目的,而是在新類里簡單地使用一個(gè)SortVector。在這種情況下,用于實(shí)現(xiàn)Compare接口的內(nèi)部類就可以“匿名”地創(chuàng)建。如下所示:
//: StrSortVector.java // Automatically sorted Vector that // accepts and prodUCes only Strings package c08; import java.util.*;
public class StrSortVector { private SortVector v = new SortVector( // Anonymous inner class: new Compare() { public boolean lessThan(Object l, Object r) { return ((String)l).toLowerCase().compareTo( ((String)r).toLowerCase()) < 0; } public boolean lessThanOrEqual(Object l, Object r) { return ((String)l).toLowerCase().compareTo( ((String)r).toLowerCase()) <= 0; } } ); private boolean sorted = false; public void addElement(String s) { v.addElement(s); sorted = false; } public String elementAt(int index) { if(!sorted) { v.sort(); sorted = true; } return (String)v.elementAt(index); } public Enumeration elements() { if(!sorted) { v.sort(); sorted = true; } return v.elements(); } // Test it: public static void main(String[] args) { StrSortVector sv = new StrSortVector(); sv.addElement("d"); sv.addElement("A"); sv.addElement("C"); sv.addElement("c"); sv.addElement("b"); sv.addElement("B"); sv.addElement("D"); sv.addElement("a"); Enumeration e = sv.elements(); while(e.hasMoreElements()) System.out.println(e.nextElement()); } } ///:~