您的位置:首页 >统计HashMap中单词出现次数及键值方法
发布于2025-08-13 阅读(0)
扫一扫,手机访问

在处理包含文本数据的HashMap时,我们常常需要统计特定单词在每个条目值中出现的频率。例如,一个HashMap可能存储了以整数为键、以句子为值的记录,我们希望统计某个单词(如“car”)在每个句子中出现的次数,并根据其出现次数重复记录对应的键。
考虑以下初始数据结构:
Map<Integer, String> carHashMap = new HashMap<>(); carHashMap.put(1, "this car is very fast car"); carHashMap.put(2, "i have a old car"); carHashMap.put(3, "my first car was an mercedes and my second car was an audi"); carHashMap.put(4, "today is a good day"); carHashMap.put(5, "car car car car");
如果采用简单的String.contains()方法来判断单词是否存在,并记录对应的键,会遇到一个问题:
ArrayList<Integer> showCarsInMap = new ArrayList<>();
for (Map.Entry<Integer, String> entrySection : carHashMap.entrySet()) {
if (entrySection.getValue().contains("car")) {
showCarsInMap.add(entrySection.getKey());
}
}
System.out.println("Car : " + showCarsInMap);
// 当前输出: Car : [1, 2, 3, 5]上述代码的输出是[1, 2, 3, 5]。这表明它只能识别出包含“car”的键,但无法区分“car”在键1的值中出现了两次,在键5的值中出现了四次。contains()方法仅返回布尔值,无法提供出现次数的信息,因此无法满足将键重复记录的需求。
为了解决上述问题,我们需要一种能够查找字符串中所有匹配项的方法。Java的java.util.regex包提供了强大的正则表达式功能,其中的Pattern和Matcher类正是为此目的而设计。
核心思想是:
为了确保只匹配完整的单词“car”,而不是“cartoon”或“scar”中的“car”部分,我们需要使用单词边界。一个常用的模式是 (?:^|\\W)car(?:$|\\W)。
这个模式有效地定义了“car”作为一个独立单词的边界。
将正则表达式应用于HashMap值的完整代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WordCounterInHashMap {
public static void main(String[] args) {
Map<Integer, String> carHashMap = new HashMap<>();
ArrayList<Integer> showCarsInMap = new ArrayList<>();
carHashMap.put(1, "this car is very fast car");
carHashMap.put(2, "i have a old car");
carHashMap.put(3, "my first car was an mercedes and my second car was an audi");
carHashMap.put(4, "today is a good day");
carHashMap.put(5, "car car car car");
// 目标单词
String targetWord = "car";
// 编译正则表达式模式
// (?:^|\\W)word(?:$|\\W) 确保匹配的是整个单词
Pattern p = Pattern.compile("(?:^|\\W)" + Pattern.quote(targetWord) + "(?:$|\\W)", Pattern.CASE_INSENSITIVE);
for (Map.Entry<Integer, String> entrySection : carHashMap.entrySet()) {
// 为当前字符串创建Matcher
Matcher m = p.matcher(entrySection.getValue());
// 循环查找所有匹配项
while (m.find()) {
// 每找到一个匹配项,就将对应的键添加到列表中
showCarsInMap.add(entrySection.getKey());
}
}
System.out.println("Car : " + showCarsInMap);
// 期望输出: Car : [1, 1, 2, 3, 3, 5, 5, 5, 5]
}
}代码解析:
运行上述代码,将得到期望的输出:Car : [1, 1, 2, 3, 3, 5, 5, 5, 5],这准确反映了“car”在每个键对应的值中出现的次数。
通过利用Java的java.util.regex包,我们能够有效地解决在HashMap值中统计特定单词出现次数并根据出现频率重复记录键的问题。Pattern和Matcher类的组合提供了强大的文本模式匹配能力,特别是while (matcher.find())循环,它允许我们遍历字符串中的所有匹配项,从而实现精确的计数。理解正则表达式模式的构建及其在Java中的应用,是处理复杂文本数据的重要技能。
上一篇:十款实用日历软件推荐指南
下一篇:虚拟内存是什么?详解电脑运行原理
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9