我想在不丢失密钥映射的情况下压扁Map将Integer密钥与列表相关联的密钥String.我很好奇,好像用stream和做这样做是有用的和有用的lambda.
我们从这样的事情开始:
Map<Integer, List<String>> mapFrom = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
我们假设mapFrom填充在某处,看起来像:
1: a,b,c
2: d,e,f
etc.
Run Code Online (Sandbox Code Playgroud)
我们还假设列表中的值是唯一的.
现在,我想"展开"它以获得第二张地图:
a: 1
b: 1
c: 1
d: 2
e: 2
f: 2
etc.
Run Code Online (Sandbox Code Playgroud)
我可以这样做(或非常相似,使用foreach):
Map<String, Integer> mapTo = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry: mapFrom.entrySet()) {
for (String s: entry.getValue()) {
mapTo.put(s, entry.getKey());
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们假设我想使用lambda而不是嵌套for循环.我可能会这样做:
Map<String, Integer> mapTo = mapFrom.entrySet().stream().map(e -> {
e.getValue().stream().?
// Here I can iterate on …Run Code Online (Sandbox Code Playgroud) 我在反转给定的映射并将其反转的键和值存储到另一个映射中时遇到了一些麻烦。我有一个方法原型如下:
public static Map<String, Set<String>> reverse (Map <String, Set<String>> graph);
Run Code Online (Sandbox Code Playgroud)
因此,如果我有有向图的示例键,则:
{c -> arraySet{f, e}}
{b -> d}
{a -> arraySet{c, b}}
{d -> g}
{e -> d}
{f -> arraySet{g, d}}
Run Code Online (Sandbox Code Playgroud)
我需要有效地反转这个图,以便我有 d -> b 而不是 b -> d。
我认为这对我来说只是交换原始图中的值和键并将它们添加到 reverseMap 中。我想我可以遍历图中给定键的每组值,然后将它们存储在列表中。
不幸的是,我在实施和考虑它时遇到了麻烦。我真的很感激朝正确方向的推动。