如何找到以给定字母开头的单词

mar*_*122 2 java set java-stream

以给定的字符串为例:例如,My name is James Bond iee我想要Map将以character为键,将字符串集作为值(该字符串集是从相应字符键开头的字符串)- 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());
}
Run Code Online (Sandbox Code Playgroud)

现在,我想遍历每个字符和每个字符串以找到这些单词,但是我在为每个字符创建集合方面感到挣扎:

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, )
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

如您所见,Ive在需要添加字符串以设置为的那一刻停止了iteratedCharacter。怎么做?也许使用流效果更好?我最想在这里使用流。

Nam*_*man 5

使用流,一旦您拥有中所有单词的数组String[] words,就可以按它们的第一个字符将它们分组collectSetas:

Map<Character, Set<String>> characterWithAccordingWord =
        Arrays.stream(words).collect(Collectors.groupingBy(word -> word.charAt(0), 
                Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud)

  • 好答案 !注意,`word.toCharArray()[0]`分配一个新数组。您想使用`word.charAt(0)`代替。 (4认同)