Java实现单词频次统计时如何避免重复字符串输出?
问题原因
现有双重循环逻辑会遍历单词数组的每一个元素,每遍历到一个单词就全量统计一次该单词的出现次数,所以同一个单词出现多少次就会重复输出多少次统计结果,未做去重处理。
优化方案
推荐使用LinkedHashMap实现频次统计,天然支持去重,还能保证输出顺序和单词首次出现的顺序一致,完全匹配你给出的预期输出格式:
import java.util.LinkedHashMap; import java.util.Map; public static void printWordsOccurence(String str) { String[] words = str.split(" "); Map<String, Integer> countMap = new LinkedHashMap<>(); // 统计单词频次 for (String word : words) { countMap.put(word, countMap.getOrDefault(word, 0) + 1); } // 按要求格式输出 int seq = 1; for (Map.Entry<String, Integer> entry : countMap.entrySet()) { System.out.printf("%d. [%d] %s%n", seq, entry.getValue(), entry.getKey()); seq++; } }
如果你的JDK版本低于8,不支持getOrDefault方法,可以将统计逻辑替换为:
for (String word : words) { if (countMap.containsKey(word)) { countMap.put(word, countMap.get(word) + 1); } else { countMap.put(word, 1); } }
如果你不想引入额外的集合类,坚持用双重循环实现,可以增加去重判断,遇到已经统计过的单词直接跳过:
public static void printWordsOccurence(String str) { String[] words = str.split(" "); int counter = 0; int seq = 1; for (int i = 0; i < words.length; i++) { // 判断当前单词是否已经在前面统计过 boolean counted = false; for (int k = 0; k < i; k++) { if (words[i].equals(words[k])) { counted = true; break; } } if (counted) { continue; } // 统计当前单词频次 for (int j = 0; j < words.length; j++) { if (words[i].equals(words[j])) { counter++; } } System.out.printf("%d. [%d] %s%n", seq, counter, words[i]); seq++; counter = 0; } }
内容的提问来源于stack exchange,提问作者khalid Morrshid
相关产品推荐
相关产品推荐

