这是一个简单的问题, 我有一个简单的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'.
答案 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();
当java-8出局时,你也可以这样做:
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);
}