说我有一张钥匙地图 - >价值对,我想扭转这一点,以便我有一个有效价值的新地图 - > key(即旧值成为新键,旧键成为新值)。
这是最好的方法吗? (我正在使用Java ......)。
哦,价值观是独一无二的。
答案 0 :(得分:12)
答案 1 :(得分:6)
我认为这里有足够的解决方案来解决您的问题。我只想指出要小心,因为如果值不是唯一的,那么可能会导致数据丢失。 F.E.如果您有以下地图:
A->X
B->Y
C->Y
并反过来你会有
X->A
Y->B
或
X->A
Y->C
取决于插入的顺序。通过再次反转它,你将有一个<键,值>少了。
答案 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