1

我刚刚完成了一项家庭作业,希望我将所有 Java 关键字添加到 HashSet。然后读入一个 .java 文件,并计算任何关键字在 .java 文件中出现的次数。

我采取的路线是:创建一个包含所有关键字的 String[] 数组。创建了一个 HashSet,并使用 Collections.addAll 将数组添加到 HashSet。然后当我遍历文本文件时,我会通过 HashSet.contains(currentWordFromFile); 检查它。

有人建议使用 HashTable 来执行此操作。然后我看到了一个使用 TreeSet 的类似示例。我只是好奇..推荐的方法是什么?

(完整代码在这里: http: //pastebin.com/GdDmCWj0

4

2 回答 2

2

尝试 aMap<String, Integer>其中 String 是单词,Integer 是单词被看到的次数。

这样做的一个好处是您不需要处理文件两次。

于 2011-04-27T05:22:15.260 回答
1

你说“有一个家庭作业”所以我假设你已经完成了这个。

我会做的有点不同。String首先,我认为您的数组中的某些关键字不正确。根据WikipediaOracle,Java 有 50 个关键字。无论如何,我已经很好地评论了我的代码。这就是我想出的...

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;

public class CountKeywords {

    public static void main(String args[]) {

        String[] theKeywords = { "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "void", "volatile", "while" };

        // put each keyword in the map with value 0 
        Map<String, Integer> theKeywordCount = new HashMap<String, Integer>();
        for (String str : theKeywords) {
            theKeywordCount.put(str, 0);
        }

        FileReader fr;
        BufferedReader br;
        File file = new File(args[0]);

        // attempt to open and read file
        try {
            fr = new FileReader(file);
            br = new BufferedReader(fr);

            String sLine;

            // read lines until reaching the end of the file
            while ((sLine = br.readLine()) != null) {

                // if an empty line was read
                if (sLine.length() != 0) {

                    // extract the words from the current line in the file
                    if (theKeywordCount.containsKey(sLine)) {
                        theKeywordCount.put(sLine, theKeywordCount.get(sLine) + 1);
                    }
                }
            }

        } catch (FileNotFoundException exception) {
            // Unable to find file.
            exception.printStackTrace();
        } catch (IOException exception) {
            // Unable to read line.
            exception.printStackTrace();
        } finally {
                br.close();
            }

        // count how many times each keyword was encontered
        int occurrences = 0;
        for (Integer i : theKeywordCount.values()) {
            occurrences += i;
        }

        System.out.println("\n\nTotal occurences in file: " + occurrences);
    }
}

每次遇到文件中的关键字时,我首先检查它是否在 Map 中;如果不是,它不是一个有效的关键字;如果是,那么我更新与关键字关联的值,即,我将关联的值增加Integer1,因为我们再次看到了这个关键字。

或者,您可以摆脱最后一个 for 循环并保持运行计数,这样您就可以...

if (theKeywordCount.containsKey(sLine)) {
    occurrences++;
}

...最后打印出计数器。

我不知道这是否是最有效的方法,但我认为这是一个坚实的开始。

如果您有任何问题,请告诉我。我希望这有帮助。
赫里斯托

于 2011-04-27T06:12:47.383 回答