查找文本中最常见的单词

时间:2020-02-12 15:14:39

标签: java algorithm hashmap bufferedreader

给我几行文字。我必须找到最常用的单词,如果出现的单词与我要找的单词一样多,那么我必须显示最小的词典。

我认为我应该使用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 个答案:

答案 0 :(得分:3)

考虑使用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 :(得分:1)

这是我要遵循的过程...

  1. 浏览所有单词
  2. 创建一个HashMap<String, Integer>。字符串是关键,这将是您存储单词的地方。整数是值,它将存储单词的出现频率。
  3. 遍历单词时,将其放入HashMap,如果该键(单词)已经存在,则用(当前值+ 1)替换该值。这将跟踪单词出现的次数。
  4. 完成单词循环之后,遍历HashMap,记住当前已知的最大值以及与之配对的键。完成后,您将获得最大的收益。