如何将键值对从一张地图映射到另一张地图

How to map Key Value pair from one map onto another

如果我有一张包含以下数据的地图:

"a", "hello"
"b", "bye"
"c", "good morning"

第二张地图包含以下数据:

"key1","a"
"key2", "b"
"key3", "c"

然后是否可以执行一个操作,以便我可以将我的第二个映射的值映射到键上作为我的第一个映射?这将导致最终地图看起来像这样:

"key1","hello"
"key2", "bye"
"key3", "good morning"
    

下面的代码应该可以满足您的要求

 public static void main(final String[] args) throws Exception {
    HashMap<String, String> keyToValue = new HashMap<String, String>() {{
        put("a", "hello");
        put("b", "bye");
        put("c", "good morning");
    }};
    HashMap<String, String> keyToSecondaryKey = new HashMap<String, String>() {{
        put("key1", "a");
        put("key2", "b");
        put("key3", "c");
    }};

    keyToSecondaryKey.entrySet().forEach(e-> {
        e.setValue(keyToValue.get(e.getValue()));
    });

    System.out.println(keyToSecondaryKey);
}

这样:

Map<String, String> map1 = new HashMap<>();
map1.put("a", "hello");
map1.put("b", "bye");
map1.put("c", "good morning");

Map<String, String> map2 = new HashMap<>();
map2.put("key1", "a");
map2.put("key2", "b");
map2.put("key3", "c");

map2.forEach((key2, value2) -> map2.put(key2, map1.get(value2)));

显然您想要第三张地图由第二张地图的键和第一张地图的匹配值组成。

Map< String , String > thirdMap = new HashMap<>() ;
for ( Map.Entry< String , String > entry : secondMap.entrySet() ) {
    thirdMap.put(
        entry.getKey() ,                  // Second map’s key.
        firstMap.get( entry.getValue() )  // First map’s value.
    );
}

这可能对你有用。请注意,这会创建第三张地图。

Map<String, String> map1 =
        Map.of("a", "hello", "b", "bye", "c", "good morning");

Map<String, String> map2 =
        Map.of("key1", "a", "key2", "b", "key3", "c");
  • 流式传输 map2
  • 的条目集
  • 使用那个 entry's key 作为结果映射的键
  • 使用 entry's value 作为键来检索 map1
  • 的值
Map<String, String> result = map2.entrySet().stream()
        .collect(Collectors.toMap(Entry::getKey,
                e->map1.get(e.getValue())));
        
result.entrySet().forEach(System.out::println);     

打印

key1=hello
key2=bye
key3=good morning

正如我在评论中提到的,下面的语句将打印 "hello"。如果您想在同一代码中访问这两张地图的内容,则无需创建 第三张地图

System.out.println(fistMap.get(secondMap.get("key1"))); 

使用以下代码,您可以迭代打印第二张地图的 keys 和第一张地图的 values (使用假设第二张地图的 所有 值作为键出现在第一张地图中)。

fistMap.forEach((k, v) -> System.out.println(k + " -> " + secondMap.get(v)));

并且只有当您需要将数据从这两个地图传递到应用程序的另一部分时,创建第三个组合地图才有意义。可以像这样用 Stream IPA 来完成:

Map<String, String> combinedMap = 
       secondMap.keySet().stream()
            .collect(Collectors.toMap(Function.identity(), // key of the new map
                                      k -> fistMap.get(secondMap.get(k)))); // value of the new map