我想知道如何修复我的代码以使我的输出正确。我只能编辑代码的特定部分。非常感谢你
这是我的代码
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}
一些建议供您考虑:
在正则表达式中,
\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());
我将以短跑运动员的答案为基础,因为他完全忽略了问题中可以改变和不能改变的内容。
尽可能多地使用 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)
}
}
您的方法并不完全正确(如果那里有其他符号怎么办?)。这样做:
- 用空格替换所有非字母数字字符。
- 分割基础空间(
)。\\s+
- 对于分割数组中的每个字符串:检查是否有一个等于字符串的键:是:获取值,增加计数并 把值放回去。 否:插入值为=1的新键
打包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());
}
}
}
}