Java
編寫通用的排序代碼時
程序設計一個主要的目標就是
下面這個
//: Compare
// Interface for sorting callback:
package c
interface Compare {
boolean lessThan(Object lhs
boolean lessThanOrEqual(Object lhs
} ///:~
對這兩種方法來說
可創建Vector的一個子類
//: SortVector
// A generic sorting vector
package c
import java
public class SortVector extends Vector {
private Compare compare; // To hold the callback
public SortVector(Compare comp) {
compare = comp;
}
public void sort() {
quickSort(
}
private void quickSort(int left
if(right > left) {
Object o
int i = left
int j = right;
while(true) {
while(compare
elementAt(++i)
;
while(j >
if(compare
elementAt(
break; // out of while
if(i >= j) break;
swap(i
}
swap(i
quickSort(left
quickSort(i+
}
}
private void swap(int loc
Object tmp = elementAt(loc
setElementAt(elementAt(loc
setElementAt(tmp
}
} ///:~
現在
為使用SortVector
//: StringSortTest
// Testing the generic sorting Vector
package c
import java
public class StringSortTest {
static class StringCompare implements Compare {
public boolean lessThan(Object l
return ((String)l)
((String)r)
}
public boolean
lessThanOrEqual(Object l
return ((String)l)
((String)r)
}
}
public static void main(String[] args) {
SortVector sv =
new SortVector(new StringCompare());
sv
sv
sv
sv
sv
sv
sv
sv
sv
Enumeration e = sv
while(e
System
}
} ///:~
內部類是
大家可以看到
比較時將字串強制為小寫形式
繼承(extends)在這兒用於創建一種新類型的Vector——也就是說
但在另一方面
//: StrSortVector
// Automatically sorted Vector that
// accepts and produces only Strings
package c
import java
public class StrSortVector {
private SortVector v = new SortVector(
// Anonymous inner class:
new Compare() {
public boolean
lessThan(Object l
return
((String)l)
((String)r)
}
public boolean
lessThanOrEqual(Object l
return
((String)l)
((String)r)
}
}
);
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());
}
} ///:~
這樣便可快速再生來自SortVector的代碼,從而獲得希望的功能。tW.WIngwIT.COM然而,並不是來自SortVector和Vector的所有public方法都能在StrSortVector中出現。若按這種形式再生代碼,可在新類裡為包含類內的每一個方法都生成一個定義。當然,也可以在剛開始時只添加少數幾個,以後根據需要再添加更多的。新類的設計最終會穩定下來。
這種方法的好處在於它仍然只接納String對象,也只產生String對象。而且相應的檢查是在編譯期間進行的,而非在運行期。當然,只有addElement()和elementAt()才具備這一特性;elements()仍然會產生一個Enumeration(枚舉),它在編譯期的類型是未定的。當然,對Enumeration以及在StrSortVector中的類型檢查會照舊進行;如果真的有什麼錯誤,運行期間會簡單地產生一個違例。事實上,我們在編譯或運行期間能保
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25414.html