Найти наиболее распространенное слово в тексте - PullRequest
0 голосов
/ 12 февраля 2020

Мне дают текст в несколько строк. Я должен найти самое распространенное слово и, если больше слов появляется столько раз, сколько искомого я ищу, мне нужно отобразить наименьшую лексикографию c.

Я думаю, что должен использовать HashMap, но я не знаю с чего начать.

Я пробовал это:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main{
    public static void main(String[] args) throws Exception {
        String line, word = "";
        int count = 0, maxCount = 0;
        ArrayList<String> words = new ArrayList<String>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while((line = br.readLine()) != null) {
            String string[] = line.toLowerCase().split("([,.\\s]+) ");
            for(String s : string){
                words.add(s);
            }
        }
        for(int i = 0; i < words.size(); i++){
            count = 1;
            for(int j = i+1; j < words.size(); j++){
                if(words.get(i).equals(words.get(j))){
                    count++;
                }
            }
            if(count > maxCount){
                maxCount = count;
                word = words.get(i);
            }
        }
        System.out.println(word);
    }
}

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Вы правы, думая о подходе HashMap к этой проблеме.

HashMap может содержать уникальное слово, которое является ключом, и его частоту, которая является значением.

Map<String, Integer> wordCounts = new HashMap<>();

Вам также не нужно использовать список, содержащий ваши слова. Поместите их прямо на карту.

Вот пример:

    String[]  words = line.toLowerCase().split("([,.\\s]+) ");
    for(String s: words){
        //get a current frequency or set to be 0 if it doesn't exist.
        Integer freq = wordCounts.getOrDefault(s, 0);
        wordCounts.put(s, freq+1);
    }

Он еще не закончен. Перебирая записи в wordCounts, вы найдете наиболее распространенное слово.

int max = 0;
String word = null;
for(Map.Entry<String, Integer> entry: wordCounts.entrySet()) {
     if(entry.getValue() > max) {
         max = entry.getValue();
         word = entry.getKey();
     }
}
1 голос
/ 12 февраля 2020

Вот процесс, которому я бы следовал ...

  1. L oop через все слова
  2. Создать HashMap<String, Integer>. Ключ - это строка, где вы будете хранить свои слова. Целое число - это значение, оно будет хранить частоту слов.
  3. При циклическом просмотре слов поместите их в HashMap, если этот ключ (слово) уже существует, замените значение на (текущее значение +1) Это позволит отслеживать, сколько раз слово появляется.
  4. Когда вы закончите цикл по словам, выполните итерацию по HashMap, запоминая известный в настоящее время максимум и ключ, который с ним связан. Как только это будет сделано, у вас будет максимум.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...