我有一个短语,我在空白处分割,并创建一个包含单词和单词索引位置的地图。
我很好。但是问题是当短语中包含重复的单词时。所以我想使用<html>
<head>
<title></title>
<body>
<div>
<label>Filed1<label>
<textarea id="text1">SRMP 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
答案 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.groupingBy
和AbstractMap.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]}