在Java中反转HashMap键和值

时间:2013-12-05 22:44:45

标签: java hashmap

这是一个简单的问题, 我有一个简单的HashMap,我想要反转键和值。

HashMap<Character, String> myHashMap = new HashMap<Character, String>();
myHashMap.put('a', "test one");
myHashMap.put('b', "test two");

我想创建一个新的HashMap,在其中放置对立面。

HashMap<String, Character> reversedHashMap = new HashMap<String, Character>();
e.g. Keys "test one" & "test two" and values 'a' & 'b'.

9 个答案:

答案 0 :(得分:103)

  

它们都是独一无二的,是的

如果您确定自己的值是唯一的,则可以迭代旧地图的条目。

Map<String, Character> myNewHashMap = new HashMap<>();
for(Map.Entry<Character, String> entry : myHashMap.entrySet()){
    myNewHashMap.put(entry.getValue(), entry.getKey());
}

或者,您可以使用Guava提供的双向地图并使用inverse()方法:

BiMap<Character, String> myBiMap = HashBiMap.create();
myBiMap.put('a', "test one");
myBiMap.put('b', "test two");

BiMap<String, Character> myBiMapInversed = myBiMap.inverse();

出局时,你也可以这样做:

Map<String, Integer> map = new HashMap<>();
map.put("a",1);
map.put("b",2);

Map<Integer, String> mapInversed = 
    map.entrySet()
       .stream()
       .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey))

最后,我将我的贡献添加到proton pack library,其中包含Stream API的实用程序方法。你可以这样做:

Map<Character, String> mapInversed = MapStream.of(map).inverseMapping().collect();

答案 1 :(得分:18)

Apache commons集合库提供了一种用于反转地图的实用程序方法。如果您确定myHashMap的值是唯一的

,则可以使用此方法
org.apache.commons.collections.MapUtils.invertMap(java.util.Map map)

示例代码

HashMap<String, Character> reversedHashMap = MapUtils.invertMap(myHashMap) 

答案 2 :(得分:6)

如果值不是唯一的,那么反转地图的安全方法是使用java 8的groupingBy函数

Map<String, Integer> map = new HashMap<>();
map.put("a",1);
map.put("b",2);

Map<Integer, List<String>> mapInversed = 
map.entrySet()
   .stream()
   .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList())))

答案 3 :(得分:3)

我写了一个更简单的循环(注意我的所有值都是唯一的):

HashMap<Character, String> myHashMap = new HashMap<Character, String>();
HashMap<String, Character> reversedHashMap = new HashMap<String, Character>();

for (char i : myHashMap.keySet()) {
    reversedHashMap.put(myHashMap.get(i), i);
}

答案 4 :(得分:2)

遍历键和值列表,然后添加它们。

HashMap<String, Character> reversedHashMap = new HashMap<String, Character>();
for (String key : myHashMap.keySet()){
    reversedHashMap.put(myHashMap.get(key), key);
}

答案 5 :(得分:2)

要回答有关如何执行此操作的问题,您可以从地图中获取entrySet,然后使用getValue作为key和{{{}进入新地图3}}为value

但请记住getKey中的键是唯一的,这意味着如果原始地图中有一个带有两个不同键的值,则只有第二个键(以迭代顺序)将为新值中的值。地图。

答案 6 :(得分:1)

private <A, B> Map<B, A> invertMap(Map<A, B> map) {
    Map<B, A> reverseMap = new HashMap<>();
    for (Map.Entry<A, B> entry : map.entrySet()) {
        reverseMap.put(entry.getValue(), entry.getKey());
    }
    return reverseMap;
}

重要的是要记住put在使用相同的密钥调用时替换值。因此,如果map有两个具有相同值的键,则只有其中一个键存在于反转映射中。

答案 7 :(得分:0)

使用下面的示例代码进行测试,并尝试使用MapUtils和Java8 Stream功能。两种情况都适用。

public static void main(String[] args) {
    Map<String, String> test = new HashMap<String, String>();
    test.put("a", "1");
    test.put("d", "1");
    test.put("b", "2");
    test.put("c", "3");
    test.put("d", "4");
    test.put("d", "41");

    System.out.println(test);

    Map<String, String> test1 = MapUtils.invertMap(test);

    System.out.println(test1);

    Map<String, String> mapInversed = 
            test.entrySet()
               .stream()
               .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));

    System.out.println(mapInversed);
}

Output:
{a=1, b=2, c=3, d=41}
{1=a, 2=b, 3=c, 41=d}
{1=a, 2=b, 3=c, 41=d}

答案 8 :(得分:0)

用于反转字典数组。 (如果值是唯一的)

private void reverseArrayMap(List<Map<String, String>> list) {
    // reversing the array of dictionary
    List<Map<String, String>> newList = new ArrayList<>();
    Map<String, String> resDic = new HashMap<>();

    for (Map<String, String> map : list) {
        map.forEach((key, value) -> resDic.put(value, key));
        newList.add(resDic);
    }

    System.out.println("Original Array of Dictionary" + list);
    System.out.println("Reversed Array of Dictionary" + newList);
}