如何统计字符串 HashMap 中单词出现的次数

问题描述 投票:0回答:4

我想知道如何修复我的代码以使我的输出正确。我只能编辑代码的特定部分。非常感谢你

这是我的代码

import java.util.HashMap;

public class OccurenceChecker {
    public static void main(String[] args) 
    { 

        //CANT BE FIXED
        String phrase = "Good Morning. Welcome to my store. My store is a grocery store.";

        HashMap<String, Integer> map = new HashMap<String, Integer>();
        String[] ignored = phrase.split("\n\t\r(){},:;!?.[]");

        //CAN BE FIX THIS POINT ON.
        for (String ignore : ignored) 
        {
            Integer count = map.get(ignore);
            if (count == null) 
            {
                count = 0;
            }
            map.put(ignore, count + 1);
        }

        for (int i = 0; i< ignored.length; i++)
        {
            System.out.println(ignored[i]);
        }
        System.out.println(map);
    }
}

预期产出

{a=1, Morning=1, grocery=1, Welcome=1, is=1, to=1, store=3, Good=1, my=2}

我的输出

{=2, a=1, Morning=1, grocery=1, Welcome=1, is=1, to=1, store=3, Good=1, my=1, My=1}
java hashmap
4个回答
3
投票

一些建议供您考虑:

在正则表达式中,

\W
指的是任何不是单词字符的东西(即不是字母的任何东西)。

如果您希望在任何标点符号或空格上进行拆分,那么您应该在正则表达式中的

+
之后添加
\W
。这会将所有后续的计数视为同一分隔符的一部分。这就是为什么您当前在答案中得到
{=2
(您的输入中有两个“.”实例,它们被分割解释为分隔符、空、分隔符)。

看起来您希望将“my”和“My”视为同一字符串。在这种情况下,您应该在将它们添加到地图之前使用

toLowerCase

如果您使用 Java 8,在映射中维护运行增量的一个简单方法是

Map<String,Integer> wordCount = new HashMap<>();
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);

再次强调,使用 Java 8,您可以一次性完成所有这一切

Map<String,Long> wordCount = Arrays.stream(phrase.toLowerCase().split("\\W+"))
    .collect(Collectors.groupingBy(Function.identy(), Collectors.counting());

1
投票

我将以短跑运动员的答案为基础,因为他完全忽略了问题中可以改变和不能改变的内容。

尽可能多地使用 Java 8。这在你的情况下并不会真正起作用,因为地图已经初始化,所以你创建另一个并替换它很奇怪

map = Arrays.stream(ignored)
        .filter(s -> !s.isEmpty()) // removed empty strings
        .map(String::toLowerCase) // makes all the strings lower case
        .collect(Collectors.groupingBy(Function.identy(), Collectors.counting());

使用更基本的 Java 8 功能并使用最初创建的地图。

Arrays.stream(ignored)
        .filter(s -> !s.isEmpty()) // removed empty strings
        .map(String::toLowerCase) // makes all the strings lower case
        .forEach(s -> map.put(s, map.getOrDefault(s, 0) + 1)

没有 Java 8

for (final String s : ignored) {
    if (s.isEmpty()) {
        continue; // skip empty strings
    }
    final String lowerS = s.toLowerCase();
    if (map.containsKey(lowerS)) {
        map.put(lowerS, map.get(lowerS) + 1)
    } else {
        map.put(lowerS, 1)
    }
}

0
投票

您的方法并不完全正确(如果那里有其他符号怎么办?)。这样做:

  1. 用空格替换所有非字母数字字符。
  2. 分割基础空间(
    \\s+
    )。
  3. 对于分割数组中的每个字符串:检查是否有一个等于字符串的键:是:获取值,增加计数并 把值放回去。 否:插入值为=1的新键

0
投票

打包test_practice;

导入java.util.HashMap; 导入 java.util.*;

公共课countWords {

public static void main(String[] args) {
    countWords("java . . . java is text");
}
public static void countWords(String str){
    str= str.toLowerCase();
    str= str.replace(".","");
    Map<String, Integer> map= new HashMap<String,Integer>();
    String[] str_new= str.split("\\s+");
  for(String c:str_new){
      if(map.containsKey(c)){
          map.put(c,map.get(c)+1);
      }
      else
      {
          map.put(c,1);
      }
  }
  for(Map.Entry<String,Integer> entry: map.entrySet()){
      if(entry.getValue()>=1){
          System.out.println(entry.getKey()+ " :"+entry.getValue());
      }
  }


}

}

© www.soinside.com 2019 - 2024. All rights reserved.