友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第137章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




    while(e。hasMoreElements())  

      sv。addElement((String)e。nextElement());  

    // This call forces a sort:  

    return sv。elements();  

  }  

  public static void main(String'' args) {  

    try {  

      SortedWordCount wc =  

        new SortedWordCount(args'0');  

      wc。countWords();  

      Enumeration keys = wc。sortedKeys();  

      while(keys。hasMoreElements()) {  

        String key = (String)keys。nextElement();  

        System。out。println(key + 〃: 〃  

                 + wc。getCounter(key)。read());  

      }  

      wc。cleanup();  

    } catch(Exception e) {  

      e。printStackTrace();  

    }  

  }  

} ///:~  

  

最好将结果按排序格式输出,但由于Java 1。0 和 Java 1。1 都没有提供任何排序方法,所以必须由自己动 



                                                                                          302 


…………………………………………………………Page 304……………………………………………………………

手。这个目标可用一个 StrSortVector 方便地达成(创建于第 8 章,属于那一章创建的软件包的一部分。记 

住本书所有子目录的起始目录都必须位于类路径中,否则程序将不能正确地编译)。  

为打开文件,使用了一个FileInputStream。而且为了将文件转换成单词,从FileInputStream 中创建了一 

个StreamTokenizer。在StreamTokenizer 中,存在一个默认的分隔符列表,我们可用一系列方法加入更多 

的分隔符。在这里,我们用ordinaryChar()指出“该字符没有特别重要的意义”,所以解析器不会把它当作 

自己创建的任何单词的一部分。例如,st。ordinaryChar('。')表示小数点不会成为解析出来的单词的一部 

分。在与Java 配套提供的联机文档中,可以找到更多的相关信息。  

在 countWords()中,每次从数据流中取出一个记号,而ttype信息的作用是判断对每个记号采取什么操作— 

—因为记号可能代表一个行尾、一个数字、一个字串或者一个字符。  

找到一个记号后,会查询Hashtable counts,核实其中是否已经以“键”(Key)的形式包含了一个记号。 

若答案是肯定的,对应的Counter (计数器)对象就会增值,指出已找到该单词的另一个实例。若答案为 

否,则新建一个Counter——因为Counter 构建器会将它的值初始化为 1,正是我们计算单词数量时的要求。  

SortedWordCount 并不属于Hashtable (散列表)的一种类型,所以它不会继承。它执行的一种特定类型的操 

作,所以尽管keys()和values() 方法都必须重新揭示出来,但仍不表示应使用那个继承,因为大量 

Hashtable 方法在这里都是不适当的。除此以外,对于另一些方法来说(比如getCounter()——用于获得一 

个特定字串的计数器;又如 sortedKeys()——用于产生一个枚举),它们最终都改变了 SortedWordCount 接 

口的形式。  

在main() 内,我们用SortedWordCount 打开和计算文件中的单词数量——总共只用了两行代码。随后,我们 

为一个排好序的键(单词)列表提取出一个枚举。并用它获得每个键以及相关的 Count (计数)。注意必须 

调用cleanup(),否则文件不能正常关闭。  

采用了 StreamTokenizer 的第二个例子将在第17 章提供。  



10。6。1 StringTokenizer   



尽管并不必要 IO 库的一部分,但StringTokenizer 提供了与 StreamTokenizer 极相似的功能,所以在这里一 

并讲述。  

StringTokenizer 的作用是每次返回字串内的一个记号。这些记号是一些由制表站、空格以及新行分隔的连 

续字符。因此,字串“Where is my cat?”的记号分别是“Where”、“is”、“my”和“cat?”。与 

StreamTokenizer 类似,我们可以指示 StringTokenizer 按照我们的愿望分割输入。但对于 

StringTokenizer,却需要向构建器传递另一个参数,即我们想使用的分隔字串。通常,如果想进行更复杂的 

操作,应使用StreamTokenizer。  

可用nextToken()向StringTokenizer 对象请求字串内的下一个记号。该方法要么返回一个记号,要么返回 

一个空字串(表示没有记号剩下)。  

作为一个例子,下述程序将执行一个有限的句法分析,查询键短语序列,了解句子暗示的是快乐亦或悲伤的 

含义。  

  

//: AnalyzeSentence。java  

// Look for particular sequences  

// within sentences。  

import java。util。*;  

  

public class AnalyzeSentence {  

  public static void main(String'' args) {  

    analyze(〃I am happy about this〃);  

    analyze(〃I am not happy about this〃);  

    analyze(〃I am not! I am happy〃);  

    analyze(〃I am sad about this〃);  

    analyze(〃I am not sad about this〃);  

    analyze(〃I am not! I am sad〃);  

    analyze(〃Are you happy about this?〃);  

    analyze(〃Are you sad about this?〃);  

    analyze(〃It's you! I am happy〃);  

    analyze(〃It's you! I am sad〃);  



                                                                                303 


…………………………………………………………Page 305……………………………………………………………

  }  

  static StringTokenizer st;  

  static void analyze(String s) {  

    prt(〃nnew sentence 》》 〃 + s);  

    boolean sad = false;  

    st = new StringTokenizer(s);  

    while (st。hasMoreTokens()) {  

      String token = next();  

      // Look until you find one of the  

      // two starting tokens:  

      if(!token。equals(〃I〃) &&  

         !token。equals(〃Are〃))  

        continue; // Top of while loop  

      if(token。equals(〃I〃)) {  

        String tk2 = next();  

        if(!tk2。equals(〃am〃)) // Must be after I  

          break; // Out of while loop  

        else {  

          String tk3 = next();  

          if(tk3。equals(〃sad〃)) {  

            sad = true;  

            break; // Out of while loop  

          }  

          if (tk3。equals(〃not〃)) {  

            String tk4 = next();  

            if(tk4。equals(〃sad〃))  

              break; // Leave sad false  

            if(tk4。equals(〃happy〃)) {  

              sad = true;  

              break;  

            }  

          }  

        }  

      }  

      if(token。equals(〃Are〃)) {  

        String tk2 = next();  

        if(!tk2。equals(〃you〃))  

          break; // Must be after Are  

        String tk3 = next();  

        if(tk3。equals(〃sad〃))  

          sad = true;  

        break; // Out of while loop  

      }  

    }  

    if(sad) prt(〃Sad detected〃);  

  }  

  static String next() {  

    if(st。hasMoreTokens()) {  

      String s = st。nextToken();  

      prt(s);  

      return s;  

    }   



                                                                                        304 


…………………………………………………………Page 306……………………………………………………………

    else  

      return 〃〃;  

  }  

返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!