2015-09-27 95 views
3

我有兩套說:拼接元素

ImmutableSet<String> firstSet = ImmutableSet.of("1","2","3"); 
ImmutableSet<String> secondSet = ImmutableSet.of("a","b","c"); 

我想獲得一組包括與每個第二的元素連接在一起的第一組元素,用分隔符即輸出一起應該是:

ImmutableSet<String> thirdSet = ImmutableSet.of("1.a","1.b","1.c","2.a","2.b","2.c","2.c","3.a","3.b","3.c"); 

我最初以爲我能做到這一點通過流的第一組(這是我的分隔符「」)並在第二個元素上應用Collectors.joining(),但這並不能解決我的需求。

回答

3

看來你正在使用番石榴。在這種情況下,你可以簡單地使用Sets.cartesianProduct方法

Set<List<String>> cartesianProduct = Sets.cartesianProduct(firstSet,secondSet); 
for (List<String> pairs : cartesianProduct) { 
    System.out.println(pairs.get(0) + "." + pairs.get(1)); 
} 

輸出:

1.a 
1.b 
1.c 
2.a 
2.b 
2.c 
3.a 
3.b 
3.c 

如果要收集它ImmutableSet<String>你可以使用

ImmutableSet<String> product = ImmutableSet.copyOf(
     cartesianProduct.stream() 
         .map(pairs -> pairs.get(0) + "." + pairs.get(1)) 
         .toArray(String[]::new) 
); 
4

我最初以爲我將能夠通過流式傳輸 第一套和應用Collectors.joining()在ele 秒,但這不會解決我的需要。

你可以做的是流第一個集合,並將每個元素與第二個集合的所有元素進行平面映射。

import static java.util.stream.Collectors.collectingAndThen; 
import static java.util.stream.Collectors.toSet; 

... 

ImmutableSet<String> thirdSet = 
    firstSet.stream() 
      .flatMap(s1 -> secondSet.stream().map(s2 -> s1+"."+s2)) 
      .collect(collectingAndThen(toSet(), ImmutableSet::copyOf)); 

如果要直接收集到ImmutableSet,您創建使用ImmutableSet的建設者自定義收集器(另見How can I collect a Java 8 stream into a Guava ImmutableCollection?)。