将key->值的hashmap“转置”为value->键?

时间:2010-07-27 20:16:51

标签: java hashmap

说我有一张钥匙地图 - >价值对,我想扭转这一点,以便我有一个有效价值的新地图 - > key(即旧值成为新键,旧键成为新值)。

这是最好的方法吗? (我正在使用Java ......)。

哦,价值观是独一无二的。

5 个答案:

答案 0 :(得分:12)

我个人使用Guava BiMap开始(使用HashBiMap之类的实现),然后在我想将值用作键时调用inverse():)< / p>

答案 1 :(得分:6)

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

A->X
B->Y
C->Y

并反过来你会有

X->A
Y->B

X->A
Y->C

取决于插入的顺序。通过再次反转它,你将有一个&lt;键,值&gt;少了。

答案 2 :(得分:5)

迭代entrySet

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

答案 3 :(得分:1)

Map<Type1,Type2> oldmap = getOldMap();
Map<Type2,Type1> newmap = new HashMap<Type2,Type1>();
for(Entry<Type1,Type2> entry : oldmap.entrySet()) {
    newmap.put(entry.getValue(),entry.getKey();
}

答案 4 :(得分:0)

您可以在Apache(http://commons.apache.org/collections/)的公共集合中使用任何实现“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