如何对字符串数组进行大小写不敏感的单词出现次数统计(以首次词为键)
统计字符串数组中单词出现次数(忽略大小写,保留首次出现原词为键)
需求说明
- 统计字符串数组中各单词的出现次数,统计时忽略大小写差异
- 最终结果的键必须使用该单词在数组中首次出现的原始形式
- 示例:
- 输入:
["AA", "Bb", "Aa", "aa", "BB"],输出:{AA=3, Bb=2} - 输入:
["AAa","aaa","BBB","bbb","BbB","AaA","AAc"],输出:{AAa=3, BBB=3, AAc=1}
- 输入:
使用ConcurrentHashMap的实现代码
以下是基于ConcurrentHashMap的Java实现:
import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class WordCount { public static void main(String[] args) { ConcurrentHashMap<String, Integer> hm = new ConcurrentHashMap<>(); String[] s1 = {"AA", "Bb", "Aa", "aa", "BB"}; for (String s : s1) { if (hm.size() == 0) { hm.put(s, 1); } else { boolean foundMatch = false; Set<String> keySet = hm.keySet(); for (String existingKey : keySet) { if (existingKey.equalsIgnoreCase(s)) { Integer count = hm.get(existingKey); hm.put(existingKey, ++count); foundMatch = true; break; } } // 仅当未找到匹配键时,才添加新条目 if (!foundMatch) { hm.put(s, 1); } } } System.out.println(hm); } }
代码逻辑说明
- 初始化
ConcurrentHashMap存储结果,键为单词首次出现的原始形式,值为对应出现次数 - 遍历输入数组的每个字符串:
- 若Map为空,直接将当前字符串作为键存入,次数设为1
- 若Map不为空,遍历已存在的键,用
equalsIgnoreCase忽略大小写匹配:- 找到匹配键时,将对应次数加1并更新Map
- 遍历完所有键都未匹配时,将当前字符串作为新键存入,次数设为1
修正说明
原代码存在逻辑冗余:遍历已有键时,每遇到不匹配的键就执行一次put操作,会导致同一新单词被重复存入多次。上面的代码通过foundMatch标记判断是否需要添加新条目,避免了不必要的Map操作。
内容的提问来源于stack exchange,提问作者ps938w
相关产品推荐
相关产品推荐

