【问题标题】:How can I print the most frequent word in a text using bufferedreader and treemap ? - Java如何使用 bufferedreader 和 treemap 打印文本中最常见的单词? - 爪哇
【发布时间】:2020-05-22 18:18:53
【问题描述】:

文本将仅包含空格和单词。

示例输入:

thanks for the help \n
the car works now   \n
thanks              \n

输出: - 因为它的字典顺序小于“Thanks”。

 public class Main {
     public static void main(String[] args) throws IOException {
         String line;
         String[] words = new String[100];
         Map < String, Integer > frequency = new HashMap < > ();
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         while ((line = reader.readLine()) != null) {
             line = line.trim();
             if (!line.isEmpty()) {
                 words = line.split("\\W+");
                 for (String word: words) {
                     String processed = word.toLowerCase();
                     processed = processed.replace(",", "");

                     if (frequency.containsKey(processed)) {
                         frequency.put(processed,
                             frequency.get(processed) + 1);
                     } else {
                         frequency.put(processed, 1);
                     }
                 }
             }
         }
         int mostFrequentlyUsed = 0;
         String theWord = null;

         for (String word: frequency.keySet()) {
             Integer theVal = frequency.get(word);
             if (theVal > mostFrequentlyUsed) {
                 mostFrequentlyUsed = theVal;
                 theWord = word;
             } else if (theVal == mostFrequentlyUsed && word.length() <
                 theWord.length()) {
                 theWord = word;
                 mostFrequentlyUsed = theVal;
             }

         }
         System.out.printf(theWord);
     }
 }

我没有通过一项测试,我真的不知道为什么我需要另一种方法。

【问题讨论】:

  • 你能提供一个你尝试过的代码示例吗?
  • 我已经添加了我的解决方案,也许我可以找到其他方法...
  • @GeorgeChetan,请格式化您的代码并使其更具可读性
  • @HarshalParekh 对不起...

标签: java arrays string bufferedreader treemap


【解决方案1】:

在您的问题标题中,您提到了 TreeMap,但实际上您并没有使用它。

如果您将实例化地图的行替换为

         NavigableMap < String, Integer > frequency = new TreeMap < > ();

然后你可以用对地图的单个查询来替换 for 循环:

System.out.println(frequency.lastEntry().key)

您可以在此处阅读文档:https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html#lastEntry--

【讨论】:

  • 但是如果我有这样的输入:“汽车感谢汽车感谢感谢”。输出将是“car”,因为它的字典序比“Thanks”小。 “汽车”出现的次数少于“谢谢”并不重要。所以基本上,如果我有更多的词出现不止一次,我必须显示最小的常用词。我可以在我的代码中修改什么?
  • 你是对的。我的解决方案不能解决你的问题。我在回答时错过了一些东西。在您最初的问题中,您说您有一个错误示例。你知道这是什么吗?您从文本中清除逗号,也许您还需要清除其他字符,例如.!? (说起这个sn-p:processed.replace(",", "");
  • 我真的不知道,我的解决方案是 5 次测试中的一项失败。它告诉我文本将只包含空格以及英文字母的小写和大写字母。
  • 我找到了问题。似乎我的话是“谢谢”,它会打印我“谢谢”。我可以添加什么来解决这个问题?如果我的单词以大写字母开头,我需要保留它。
  • toLowerCase 将大写字符变为小写。所以“谢谢”变成了“谢谢”。删除包含word.toLowerCase() 的行可以解决这个问题,但这也意味着“谢谢”和“谢谢”将被视为不同的词。这里没有对错,这取决于你想做什么......
猜你喜欢
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多