我刚做了一个家庭作业,希望我将所有Java关键字添加到HashSet中。然后读入.java文件,并计算任何关键字出现在.java文件中的次数。
我采取的路线是: 创建了一个包含所有关键字的String []数组。 创建了一个HashSet,并使用Collections.addAll将数组添加到HashSet。 然后,当我遍历文本文件时,我会通过HashSet.contains(currentWordFromFile)检查它;
有人建议使用HashTable来执行此操作。然后我看到了一个使用TreeSet的类似示例。我只是好奇..推荐的方法是什么?
(完整代码:http://pastebin.com/GdDmCWj0)
答案 0 :(得分:2)
尝试Map<String, Integer>
,其中字符串是单词,整数是单词被看到的次数。
这样做的一个好处是您不需要两次处理文件。
答案 1 :(得分:1)
你说“做了一个家庭作业”,所以我假设你完成了这件事。
我会做的有点不同。首先,我认为String
数组中的某些关键字不正确。根据{{3}}和Wikipedia,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中;如果不是,它不是有效的关键字;如果是,则更新关键字所关联的值,即我将关联的Integer
增加1,因为我们再次看到此关键字。
或者,您可以摆脱最后一个循环并保持一个运行计数,所以你会改为......
if (theKeywordCount.containsKey(sLine)) {
occurrences++;
}
...然后你打印出柜台。
我不知道这是否是最有效的方式,但我认为这是一个可靠的开始。
如果您有任何疑问,请与我们联系。我希望这会有所帮助 赫里斯托斯