Самый эффективный способ проверить файл на наличие списка слов - PullRequest
1 голос
/ 27 апреля 2011

У меня было домашнее задание, в котором я хотел добавить все ключевые слова Java в HashSet. Затем прочитайте файл .java и посчитайте, сколько раз любое ключевое слово появилось в файле .java.

Я выбрал маршрут: Создан массив String [], содержащий все ключевые слова. Создал HashSet и использовал Collections.addAll для добавления массива в HashSet. Затем, перебирая текстовый файл, я проверял его с помощью HashSet.contains (currentWordFromFile);

Кто-то рекомендовал использовать HashTable для этого. Затем я увидел похожий пример с использованием TreeSet. Мне было просто любопытно ... каков рекомендуемый способ сделать это?

(Полный код здесь: http://pastebin.com/GdDmCWj0)

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Попробуйте Map<String, Integer>, где строка - это слово, а целое число - количество раз, когда слово было просмотрено.

Одним из преимуществ этого является то, что вам не нужно обрабатывать файл дважды.

1 голос
/ 27 апреля 2011

Вы сказали, что "у вас есть домашнее задание", так что я предполагаю, что вы закончили с этим.

Я бы сделал это немного по-другому.Во-первых, я думаю, что некоторые ключевые слова в вашем массиве 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, потому что мы уже видели это ключевое слово еще раз.

В качестве альтернативы, вы можете избавиться от этогопоследний для цикла и просто сохранить счетчик, так что вместо этого у вас будет ...

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

... и вы распечатаете счетчик в конце.

Я неЯ знаю, если это самый эффективный способ сделать это, но я думаю, что это хорошее начало.

Дайте мне знать, если у вас есть какие-либо вопросы.Надеюсь, это поможет.
Христо

...