Java 查找文本中最常用的单词

Java 查找文本中最常用的单词,java,algorithm,hashmap,bufferedreader,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 v

有人给了我几行文字。我必须找到最常见的单词,如果更多的单词出现的次数与我正在寻找的单词一样多,我必须显示最小的词典

我想我应该使用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);
    }
}
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.InputStreamReader;
导入java.util.ArrayList;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串行,word=“”;
int count=0,maxCount=0;
ArrayList words=新的ArrayList();
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
而((line=br.readLine())!=null){
字符串[]=line.toLowerCase().split(([,.\\s]+))”;
for(字符串s:String){
字。加上(s);
}
}
for(int i=0;i最大计数){
最大计数=计数;
单词=单词。获取(i);
}
}
System.out.println(word);
}
}

以下是我将遵循的流程

  • 循环浏览所有单词
  • 创建一个
    HashMap
    。字符串是键,这将是存储单词的地方。整数是值,这将存储单词的频率
  • 在循环遍历单词时,将它们放入HashMap,如果该键(单词)已经存在,则将该值替换为(当前值+1)。这将记录单词出现的次数
  • 完成单词循环后,遍历HashMap,记住当前已知的最大值和与其配对的键。一旦完成,您将获得最大的收益

  • 在考虑解决此问题的
    HashMap
    方法时,您是正确的

    HashMap可以包含一个唯一的单词,它是一个键,它的频率是一个值

    Map<String, Integer> wordCounts = new HashMap<>();
    
    它还没有完成。循环搜索
    字数
    的条目以查找最常用的单词

    int max = 0;
    String word = null;
    for(Map.Entry<String, Integer> entry: wordCounts.entrySet()) {
         if(entry.getValue() > max) {
             max = entry.getValue();
             word = entry.getKey();
         }
    }
    
    int max=0;
    字符串字=null;
    for(Map.Entry:wordCounts.entrySet()){
    if(entry.getValue()>max){
    max=entry.getValue();
    word=entry.getKey();
    }
    }
    
    您不必使用HashMap。ArrayList也可以。我认为你已经找到了解决这个问题的好方法。我建议将问题分解成更小的部分和案例,然后再继续。例如,从读取示例文件中的单词开始。它有用吗?它的字数和预期的一样多吗?然后进入下一阶段,找到最常用的单词。它能做到吗?你能处理多个“最常见”的情况吗。等等我强烈推荐打印每一个部分。可以考虑使用Hashmap的这个改变…取hashmap words=newhashmap(),而不是ArrayList“words”;然后检查map是否包含您的实际单词作为关键字:如果没有将其放在map中,则使用值1,否则增加值。好的答案,尽管我会使用名称
    wordCounts
    ,而不是
    result
    ,它对map的内容没有任何意义。@VGR,非常同意:-)。将对其进行更新以使其更好。@TranHo通过按字典顺序计算最大计数和最小计数来完成您的答案。@vivek_23,哈哈,差点忘了。我会更新它:D.ThanksI因为同样的想法而投票,但我的答案比你的快1秒钟D@TranHo看起来你赢了我,会投你的票吗,因为它有代码示例
    int max = 0;
    String word = null;
    for(Map.Entry<String, Integer> entry: wordCounts.entrySet()) {
         if(entry.getValue() > max) {
             max = entry.getValue();
             word = entry.getKey();
         }
    }