八宝书库 > 文学其他电子书 > Java编程思想第4版[中文版](PDF格式) >

第63部分

Java编程思想第4版[中文版](PDF格式)-第63部分

小说: Java编程思想第4版[中文版](PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 

返回目录 上一页 下一页 回到顶部 0 1

你可能喜欢的