Как исправить метод печати null для некоторых итераций? - PullRequest
0 голосов
/ 16 апреля 2019

Напишите программу, которая будет вычислять словарный запас текста в файле и частоту наиболее распространенного слова.Словарный запас - это количество слов в тексте, разделенное на количество отдельных слов.Частота слова - это количество раз, когда слово упоминается в тексте, деленное на общее количество слов в тексте.

Определите и внедрите класс WordCounter с двумя частными полями: String word и int count, конструктор WordCounter(String word) и открытые методы String getName(), int getCount() и void addToCounter().

Определить и реализовать класс Corpus (как в текстовом корпусе) с одним закрытым полем ArrayList<WordCounter> слова,конструктор Corpus(BufferedReader infile) и открытые методы double getVocabularyRichness() и String getMostFrequentWord().

Реализация тестовой программы (как общедоступного метода static void main в Corpus), которая считывает все файлы в определенной папке, создает объект Corpus из каждого (ранее открытого) файла и сохраняет запрошенныйстатистика в другой файл stats.csv.Вы можете создать новый объект Корпус для каждого файла или определить ArrayList<Corpus> корпуса.

Каждая строка файла CSV должна состоять из трех полей, разделенных запятыми (но без пробелов!): Имя файла, богатство словарного запаса и наиболее часто используемое слово.Запустите вашу программу на все пьесы Шекспира.Отправьте CSV-файл вместе с Java-файлом.

Я написал, как мне кажется, правильную реализацию проблемы HW, поскольку она корректно работает для некоторых текстовых файлов, но только для words.get(i).getName() (я тестировал сwords.get(i).getCount()) метод выведет пробел для некоторых файлов.Я перепробовал все, и не могу понять это.Можете ли вы дать мне подсказку или несколько советов, как решить эту проблему?

public class Corpus {

    private ArrayList<WordCounter> words = new ArrayList <WordCounter>() ;

    Corpus(BufferedReader infile){
    String ln;
        try {
            while((ln = infile.readLine()) != null) {
                for (String word : ln.toLowerCase().split("([,.\\s]+)")) {
                    int reference = 0;
                    for(int i = 0; i < words.size(); i++) { 
                        if (word.equals(words.get(i).getName())) { 
                            reference++; 
                            words.get(i).addToCounter();
                        } }
                    if (reference==0) { words.add(new WordCounter(word)); }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 

    public double getVocabularyRichness() {
        int word_count=0;
        for(int i = 0; i < words.size(); i++) {
            word_count=word_count+words.get(i).getCount();
        }
        return (double)word_count/(double)words.size();

    }
    public String getMostFrequentWord() {
     String winner = "*AN ERROR OCCURRED*";
        int max_count = 0;
        for(int i = 0; i < words.size(); i++) {
            if(words.get(i).getCount() > max_count){ 
                max_count = words.get(i).getCount(); 
            }
        }
        for(int i = 0; i < words.size(); i++) {
            if(words.get(i).getCount() == max_count){ 
                winner = words.get(i).getName();

            }
        }

        //winner="Test " + String.valueOf(words.get(i).getName());;
        //return String.valueOf(max_count);
        return winner;   
    }

    public static void main(String [] args) throws Exception{
            BufferedWriter writer = null;
            File folder_location = new File("/Users/joaquindelaguardia/Desktop/Shakespeare");
            File[] file_array = folder_location.listFiles();
            for(File iteration_file: file_array) {
                FileReader current_file = new FileReader(iteration_file);
                BufferedReader infile = new BufferedReader(current_file);

                Corpus obj1 = new Corpus(infile);
                String file_name = iteration_file.getName();
                String frequent_word = obj1.getMostFrequentWord();
                String vocabulary_richness = String.valueOf(obj1.getVocabularyRichness());

                System.out.println(file_name);
                System.out.println(frequent_word);
                System.out.println(vocabulary_richness);
                System.out.println("-----------------------------");


                //FileWriter file_writer = new FileWriter("/Users/joaquindelaguardia/Desktop/stats.csv");
                //writer = new BufferedWriter(file_writer);

                //String output = file_name+", "+frequent_word+", "+vocabulary_richness + "\n";

                //writer.append(output);

            }
            //writer.close();

    }

}

public class WordCounter {

    private String word;
    private int count=1;

    WordCounter(String word){
        this.word=word;
    }

    public String getName() {
        return word;
    }

    public int getCount() {
        return count;
    }

    public void addToCounter() {
        count++;
    }
}

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

shakespeare-lovers-62.txt

и

2.2409948542024014

Шекспир-Джулиус-26.txt

6.413205537806177

...