Java编程思想第4版[中文版](PDF格式)-第63部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
8。4。3 Stack
Stack 有时也可以称为“后入先出”(LIFO )集合。换言之,我们在堆栈里最后“压入”的东西将是以后第
一个“弹出”的。和其他所有 Java 集合一样,我们压入和弹出的都是“对象”,所以必须对自己弹出的东西
进行“造型”。
一种很少见的做法是拒绝使用Vector 作为一个Stack 的基本构成元素,而是从Vector 里“继承”一个
Stack。这样一来,它就拥有了一个Vector 的所有特征及行为,另外加上一些额外的Stack 行为。很难判断
出设计者到底是明确想这样做,还是属于一种固有的设计。
下面是一个简单的堆栈示例,它能读入数组的每一行,同时将其作为字串压入堆栈。
//: Stacks。java
// Demonstration of Stack Class
import java。util。*;
public class Stacks {
static String'' months = {
〃January〃; 〃February〃; 〃March〃; 〃April〃;
〃May〃; 〃June〃; 〃July〃; 〃August〃; 〃September〃;
〃October〃; 〃November〃; 〃December〃 };
public static void main(String'' args) {
Stack stk = new Stack();
for(int i = 0; i 《 months。length; i++)
stk。push(months'i' + 〃 〃);
System。out。println(〃stk = 〃 + stk);
222
…………………………………………………………Page 224……………………………………………………………
// Treating a stack as a Vector:
stk。addElement(〃The last line〃);
System。out。println(
〃element 5 = 〃 + stk。elementAt(5));
System。out。println(〃popping elements:〃);
while(!stk。empty())
System。out。println(stk。pop());
}
} ///:~
months 数组的每一行都通过 push()继承进入堆栈,稍后用 pop()从堆栈的顶部将其取出。要声明的一点是,
Vector 操作亦可针对 Stack 对象进行。这可能是由继承的特质决定的——Stack “属于”一种Vector。因
此,能对Vector 进行的操作亦可针对Stack 进行,例如 elementAt()方法。
8。4。4 Hashtable
Vector 允许我们用一个数字从一系列对象中作出选择,所以它实际是将数字同对象关联起来了。但假如我们
想根据其他标准选择一系列对象呢?堆栈就是这样的一个例子:它的选择标准是“最后压入堆栈的东西”。
这种“从一系列对象中选择”的概念亦可叫作一个“映射”、“字典”或者“关联数组”。从概念上讲,它
看起来象一个Vector,但却不是通过数字来查找对象,而是用另一个对象来查找它们!这通常都属于一个程
序中的重要进程。
在Java 中,这个概念具体反映到抽象类Dictionary 身上。该类的接口是非常直观的 size()告诉我们其中包
含了多少元素;isEmpty()判断是否包含了元素(是则为 true);put(Object key; Object value)添加一个
值(我们希望的东西),并将其同一个键关联起来(想用于搜索它的东西);get(Object key)获得与某个键
对应的值;而remove(Object Key)用于从列表中删除“键-值”对。还可以使用枚举技术:keys()产生对键
的一个枚举(Enumeration);而 elements()产生对所有值的一个枚举。这便是一个Dict ionary (字典)的
全部。
Dictionary 的实现过程并不麻烦。下面列出一种简单的方法,它使用了两个Vector,一个用于容纳键,另一
个用来容纳值:
//: AssocArray。java
// Simple version of a Dictionary
import java。util。*;
public class AssocArray extends Dictionary {
private Vector keys = new Vector();
private Vector values = new Vector();
public int size() { return keys。size(); }
public boolean isEmpty() {
return keys。isEmpty();
}
public Object put(Object key; Object value) {
keys。addElement(key);
values。addElement(value);
return key;
}
public Object get(Object key) {
int index = keys。indexOf(key);
// indexOf() Returns …1 if key not found:
if(index == …1) return null;
return values。elementAt(index);
}
public Object remove(Object key) {
223
…………………………………………………………Page 225……………………………………………………………
int index = keys。indexOf(key);
if(index == …1) return null;
keys。removeElementAt(index);
Object returnval = values。elementAt(index);
values。removeElementAt(index);
return returnval;
}
public Enumeration keys() {
return keys。elements();
}
public Enumeration e lements() {
return values。elements();
}
// Test it:
public static void main(String'' args) {
AssocArray aa = new AssocArray();
for(char c = 'a'; c