Java &引用;转置;键的哈希映射->;价值对价值->;钥匙

Java &引用;转置;键的哈希映射->;价值对价值->;钥匙,java,hashmap,Java,Hashmap,假设我有一个键->值对的映射,我想反转它,这样我就有了一个新映射,它实际上是值->键(即旧值变成新键,旧键变成新值) 最好的方法是什么?(我正在使用Java…) Oh和值是唯一的。在入口集上迭代: for ( Map.Entry<K, V> entry : map.entrySet() ) { newMap.put(entry.getValue(), entry.getKey()); } return newMap; for(Map.Entry:Map.entrySet()

假设我有一个键->值对的映射,我想反转它,这样我就有了一个新映射,它实际上是值->键(即旧值变成新键,旧键变成新值)

最好的方法是什么?(我正在使用Java…)


Oh和值是唯一的。

入口集上迭代:

for ( Map.Entry<K, V> entry : map.entrySet() ) {
    newMap.put(entry.getValue(), entry.getKey());
}
return newMap;
for(Map.Entry:Map.entrySet()){
newMap.put(entry.getValue(),entry.getKey());
}
返回newMap;

就我个人而言,我会先使用番石榴(使用诸如的实现),然后在我想将值用作键时调用
inverse()

Map oldmap=getOldMap();
Map newmap=newhashmap();
for(条目:oldmap.entrySet()){
newmap.put(entry.getValue(),entry.getKey();
}

您可以使用在Apache()的公共集合中实现“BidiMap”接口的任何类。这更有效,因为双向映射是在填充时构造的,不需要创建新映射,这在映射较大时可能不实用

BidiMap aMap = new DualHashBidiMap();
aMap.put("B", "A");
aMap.put("A", "B");
aMap.put("C", "D");
aMap.put("X", "D");
MapIterator it = aMap.mapIterator();
System.out.println("Before Inverse");
while (it.hasNext()) {
    key = it.next();
    value = it.getValue();
    out.println(key + " -> " + value);
}
aMap = aMap.inverseBidiMap();
System.out.println("After Inverse");
it = aMap.mapIterator();
while (it.hasNext()) {
    key = it.next();
    value = it.getValue();
    out.println(key + " -> " + value);
}

Before Inverse
A -> B
B -> A
X -> D
After Inverse
D -> X
A -> B
B -> A

我认为这里有足够的解决方案来解决您的问题。我只想指出要小心,因为如果值不是唯一的,可能会导致数据丢失。 F.e.如果您有以下地图:

A->X
B->Y
C->Y
反过来,你会得到

X->A
Y->B


这取决于插入的顺序。通过再次反转,您将少一个对。

如果值不唯一,也可以使用Guava:ImmutableMultimap.copyOf(Multimaps.forMap(Map)).inverse().asMap()创建映射;太棒了!因此,如果不处理唯一值,应该将映射转储到多维数组并转置它。然后按原样使用它
X->A
Y->B
X->A
Y->C