给出字符串,例如:My name is James Bond iee
我想要的结果是Map
的字符为键,字符串集为值(这组字符串是以相应的字符键开头的字符串) -Map<Character,Set<String>>
。
例如:
m - my, n - name, i - is, iee, j - james etc.
我已经完成了从标点符号中清除字符串的工作,并完成了负责查找字符的书面方法。在我的示例中:(m,n,u,j,b)
这些方法:
static String getPurifiedSentenceFromPunctuationMarks(String sentence) {
return sentence.replaceAll("\\p{P}", "");
}
static Set<Character> getEveryCharacterOccuringInSentence(String sentence) {
return sentence.chars()
.mapToObj(e -> (char) e).collect(Collectors.toSet());
}
现在,我想遍历每个字符和每个字符串以找到这些单词,但是我在为每个字符创建集合方面都感到困惑:
String purifiedSentenceFromPunctuationMarks = AP.getPurifiedSentenceFromPunctuationMarks(sentence);
Set<Character> characters = AP.getEveryCharacterOccuringInSentence(purifiedSentenceFromPunctuationMarks);
String[] words = purifiedSentenceFromPunctuationMarks.split("\\s");
Map<Character, Set<String>> characterWithAccordingWord = new LinkedHashMap<>();
Set<String> nonRepeatableWords = new HashSet<>();
for (char iteratedCharacter : characters) {
for (String iteratedWord : words) {
if (iteratedWord.indexOf(iteratedCharacter) >= 0) {
characterWithAccordingWord.put(iteratedCharacter, )
}
}
}
您看到Ive在需要添加字符串以设置iteratedCharacter
的那一刻停止了。怎么做?
也许使用流效果更好?我最想在这里使用流。
答案 0 :(得分:5)
使用流,一旦String[] words
中包含所有单词的数组,就可以按其首字符和collect
将它们分组为Set
,如下所示:
Map<Character, Set<String>> characterWithAccordingWord =
Arrays.stream(words).collect(Collectors.groupingBy(word -> word.charAt(0),
Collectors.toSet()));
答案 1 :(得分:2)
您有一个Map<Character, Set<String>>
您有字母“ n”和单词“ name”。并且您要确保与映射中的键“ n”关联的Set包含单词“ name”。
那你怎么办?好吧,感谢键“ n”,您可以从地图上获得Set。然后将单词添加到集合中。
可能出什么问题了?好吧,键'n'的映射中可能还没有Set。因此,检查集合是否为空。如果为空,请先创建一个空集,然后将其放入地图中,然后再将该单词添加到此新的空集中。
您应该尝试自己进行操作,因为了解这些集合的基础知识很重要。
完成后,您可以使用Map的computeIfAbsent()
方法,该方法可以将代码转换为单行代码。
完成后,您就可以开始研究Streams,并使用groupingBy
收集器。
答案 2 :(得分:2)
要保留句子中单词与Collectors.groupingBy()
一起出现的顺序,您还需要在LinkedHashMap
中提到您需要它:
String sentence = "My name is, james bond iee. !";
Map<Character, Set<String>> map = Arrays.stream(sentence.replaceAll("[^a-zA-Z0-9]", " ")
.split("\\s+"))
.collect(Collectors.groupingBy(s -> s.charAt(0),
LinkedHashMap::new,
Collectors.toCollection(LinkedHashSet::new)));
System.out.println(map);
还请注意,我使用正则表达式\ s +将字符串拆分为任何白色字符。
输出:
{M=[My], n=[name], i=[is, iee], j=[james], b=[bond]}
编辑为在注释中包含@davidxxx建议,以通过将Collectors.toSet()
更改为Collectors.toCollection(LinkedHashSet::new)
来保持单词和字母的正确顺序,这样做还将保留集合中单词的顺序。 / p>