Поиск по частоте строк не находит все слова - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь реализовать алгоритм поиска по частоте строк, который анализирует файл jokes.txt и получает количество вхождений каждого уникального слова в тесте.Алгоритм должен учитывать чувствительность к регистру и делать «а» и «А» уникальными.На данный момент алгоритм, похоже, пропускает первое вхождение «a» в тесте и многие другие слова позже.

Кроме того, массив words содержит каждое слово в тексте.Каким-то образом цикл в условии (!isDuplicate) пропускает «а» и не увеличивает count.

jokes.txt

I wondered why the baseball was getting bigger.
Then it hit me.

Police were called to a day care
where a 3-yr-old was resisting a rest.
...

WordCounter.java

import java.util.*;
import java.io.FileNotFoundException;
import java.io.FileInputStream;

public class WordCounter {
    ArrayList<String> words = new ArrayList<String>();

    //prints number of words in the  file
    public void numOfWords(Scanner key1) {
        int counter = 1;
        while(key1.hasNext()) {
            words.add(key1.next().replaceAll("[^a-zA-Z]", ""));

        }
    }

    //Takes word as parameter and returns frequency of that word
    public void frequencyCounter(Scanner key1) {
        ArrayList <String> freqWords = new ArrayList<String>();
        int count = 1;
        int counter = 1;

        for(int i = 0; i < words.size(); i++){
            boolean isDuplicate = false;
            for (String s: freqWords){
                if (s.contains(words.get(i).trim()))
                    isDuplicate =true;
            }

            if (!isDuplicate){

                for(int j = i + 1; j < words.size(); j++){
                    if(words.get(i).equals(words.get(j))){
                        count++;
                    }
                }
                freqWords.add(count + "-" + words.get(i));
                Collections.sort(freqWords, Collections.reverseOrder());
                count = 1;     
            }
        }

        for(int i = 0; i < freqWords.size(); i++) {
            System.out.print((i+1) + "       ");
            System.out.println(freqWords.get(i));
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Ваша логика определения дубликатов немного неверна:

        boolean isDuplicate = false;
        for (String s: freqWords){
            if (s.contains(words.get(i).trim()))
                isDuplicate =true;
        }

Это сделает isDuplicate равным true, если words.get (i) равен "a", а s это "яблоко", потому что яблоко содержит "a».Проверьте, точно ли слово в s соответствует word.get (i).

0 голосов
/ 28 ноября 2018

просто отредактируйте мой неправильный ответ:

Но, возможно, проблема заключается в том, что функция содержит (), так как API сообщает нам, что он ищет Charsequenz в строке.Это означает, что вы в основном ищете Charsequenz «a» в каждом слове и говорите, что это дубликат.Таким образом, он считает «день» на единицу больше, потому что вы ищете «a»

. По моему мнению, было бы лучше использовать HashMap для поиска дубликатов, и это было бы еще быстрее.И вы можете посчитать, сколько их в значениях.

...