下面是一個例子,以測試沿:
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Assert;
import org.junit.Test;
public class SoTests {
@Test
public void so01() {
HashMap<Integer, List<String>> input = new HashMap<>(4);
input.put(3, Arrays.asList("a", "b", "c"));
input.put(6, Arrays.asList("b", "c"));
input.put(9, Arrays.asList("a", "c"));
input.put(12, Arrays.asList("b", "c"));
HashMap<String, HashSet<Integer>> output = process(input);
HashMap<String, HashSet<Integer>> expectedOutput = new HashMap<>(3);
expectedOutput.put("a", new HashSet<>(Arrays.asList(3, 9)));
expectedOutput.put("b", new HashSet<>(Arrays.asList(3, 6, 12)));
expectedOutput.put("c", new HashSet<>(Arrays.asList(3, 6, 9, 12)));
Assert.assertEquals(expectedOutput, output);
}
private HashMap<String, HashSet<Integer>> process(HashMap<Integer, List<String>> input) {
return input.entrySet().stream() //
.flatMap(entry -> entry.getValue().stream().map(s -> new IntegerAndString(entry.getKey(), s))) //
.collect(Collectors.groupingBy(IntegerAndString::getString, HashMap::new, //
Collectors.mapping(IntegerAndString::getInteger, Collectors.toCollection(HashSet::new))));
}
private static class IntegerAndString {
private final Integer integer;
private final String string;
IntegerAndString(Integer integer, String string) {
this.integer = integer;
this.string = string;
}
Integer getInteger() {
return integer;
}
String getString() {
return string;
}
}
}
實際的邏輯是在process
方法。醜陋的IntegerAndString
類是由於缺乏Java中的元組類型。您可以使用一些庫,如javatuples。
你嘗試過這麼遠嗎? – Jens
以前的Stack Overflow已經覆蓋了類似的任務,並且有很好的答案,但是他們很難搜索(我沒有很容易找到一個例子)。我仍然鼓勵你嘗試你的搜索技巧和運氣。 –
[Java8流的可能的重複:將值作爲列表移調的映射](https://stackoverflow.com/questions/38471056/java8-streams-transpose-map-with-values-as-list) –