从流收集到多图

时间:2019-04-30 21:31:40

标签: java java-8 java-stream

我有一个短语,我在空白处分割,并创建一个包含单词和单词索引位置的地图。

我很好。但是问题是当短语中包含重复的单词时。所以我想使用<html> <head> <title></title> <body> <div> <label>Filed1<label> <textarea id="text1">SRMP&#13;&#10;66505430</textarea> </div> <div> <label>Filed2:</label> <textarea id="text2"></textarea> </div> <div> <label>Filed3:</label> <textarea id="text3"></textarea> </div> <div> <label>Filed4:</label> <textarea id="text4"></textarea> </div> </body> </html>

是否可以使用以下流的收集器生成Multimap?

com.google.common.collect.Multimap

3 个答案:

答案 0 :(得分:0)

Stream.collect()是一种非常通用的API,因此没有特殊原因无法收集到Multimap。但是Collectors.toMap()的任何变体都不能支持这一点,因为com.google.common.collect.Multimap不是java.util.Map

我不知道有一个现有的Collector实现可以做到这一点,但是肯定可以通过直接实现Collector来编写一个实现。

答案 1 :(得分:0)

您可以使用此功能:

List<String> words = Arrays.asList("a b c d e a b c".split("\\s+"));
Multimap<String, Integer> tokenMap = IntStream.range(0, words.size()).boxed()
        .collect(ArrayListMultimap::create, (m, i) -> m.put(words.get(i), i), Multimap::putAll);

结果将是:

{a=[0, 5], b=[1, 6], c=[2, 7], d=[3], e=[4]}

答案 2 :(得分:0)

您可以使用Collectors.groupingByAbstractMap.SimpleEntry

String phrase = "deadpool tony american tony";
    List<String> words = Arrays.asList(phrase.split("\\s+"));

    Map<String, List<Integer>> result = IntStream.range(0, words.size())
            .mapToObj(i -> new AbstractMap.SimpleEntry<>(words.get(i), i)).collect(
                    Collectors.groupingBy(Entry::getKey, Collectors.mapping(Entry::getValue, Collectors.toList())));

    System.out.println(result);    //{tony=[1, 3], deadpool=[0], american=[2]}