Вы сказали "было домашнее задание", так что я предполагаю, что вы закончили с этим.
Я бы сделал немного по другому. Во-первых, я думаю, что некоторые ключевые слова в вашем массиве String
были неверными. Согласно Википедии и Oracle, 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);
}
}
Каждый раз, когда я встречаю ключевое слово из файла, я сначала проверяю, есть ли оно на карте; если это не так, это недопустимое ключевое слово; если это так, то я обновляю значение, с которым связано ключевое слово, т. е. я увеличиваю связанное Integer
на 1, потому что мы видели это ключевое слово еще раз.
В качестве альтернативы вы можете избавиться от этого последнего цикла for и просто вести текущий счет, поэтому вместо этого у вас будет...
if (theKeywordCount.containsKey(sLine)) {
occurrences++;
}
... и вы распечатываете счетчик в конце.
Я не знаю, является ли это самым эффективным способом сделать это, но я думаю, что это хорошее начало.
Дайте знать, если у вас появятся вопросы. Надеюсь, это поможет.
Христо
person
Hristo
schedule
27.04.2011