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

时间:2019-09-01 09:41:57

标签: java set java-stream

给出字符串,例如: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的那一刻停止了。怎么做? 也许使用流效果更好?我最想在这里使用流。

3 个答案:

答案 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>

相关问题