文
章
目
录
章
目
录
在 Java 字符串中查找重复或重复的单词是一个非常常见的面试问题。我们可以使用不同的方法(例如Collections和Java 8 Streams )找到所有重复的单词。
假设我们有一个带有名称的字符串。我们想要计算哪些名字出现多次。我们可能还想计算此类重复单词以及所有单词的出现次数。
String sentence = "alex brian charles alex charles david eric david";
上面的字符串包含 3 个出现两次的重复单词和两个唯一单词。
alex=2
charles=2
david=2
brian=1
eric=1
2. 使用Stream查找重复单词
Java Stream API 提供了几种有用的方法来迭代集合、执行中间操作以及将匹配项收集到新集合中。
- 在给定的 Java 程序中,我们执行以下步骤:
- 用空格分割字符串以获取String[]中的所有单词
- 将String[]转换为包含所有单词的列表
- 使用Stream迭代List并查找重复单词
为了确定一个单词是否重复,我们维护一个HashSet。如果Set.add()方法返回false,则意味着该单词已存在于集合中,因此它是重复的。
List<String> wordsList = Arrays.stream(sentence.split(" ")).collect(Collectors.toList());
Set<String> tempSet = new HashSet<>();
List<String> duplicateWords = wordsList.stream()
.filter(w -> !tempSet.add(w))
.collect(Collectors.toList());
System.out.println(duplicateWords);
程序输出:
[alex, charles, david]
假设我们想要计算句子中每个单词的出现次数,那么我们可以使用toMap()收集单词并使用Math::addExact计算出现次数。
List<String> wordsList = Arrays.stream(sentence.split(" ")).collect(Collectors.toList());
Map<String, Integer> wordsMapWithCount = wordsList.stream()
.collect(Collectors.toMap(Function.identity(), word -> 1, Math::addExact));
System.out.println(wordsMapWithCount);
程序输出:
{alex=2, charles=2, david=2}
3. 使用集合查找重复单词
很大程度上,使用集合查找重复项的过程与以前的方法类似。
我们首先分割字符串并收集List中的所有单词。然后我们使用HashSet.add()方法来检查单词是否唯一或重复。
List<String> wordsList = Arrays.asList(sentence.split(" "));
Set<String> tempSet = new HashSet<>();
List<String> duplicateWords = new ArrayList<>();
for (String word : wordsList) {
if (!tempSet.add(word)) {
duplicateWords.add(word);
}
}
System.out.println(duplicateWords);
程序输出:
[alex, charles, david]
如果我们有兴趣查找重复单词及其在String中出现的次数,我们可以使用Collections.Frequency(list, item) API 来计算某个项目在指定list中出现的次数。
Map<String, Integer> dupWordsMapWithCount = new HashMap<>();
for (String word : duplicateWords) {
dupWordsMapWithCount.put(word, Collections.frequency(wordsList, word));
}
System.out.println(dupWordsMapWithCount);
程序输出:
{alex=2, charles=2, david=2}
4.结论
在本 Java 教程中,我们讨论了查找字符串中所有重复单词以及它们在该字符串中出现的次数的两种方法。这些 Java 程序也可用于查找字符串中的唯一单词。