假設我有一個關鍵字 - >值對的映射,我想對此進行反轉,以便我有一個有效的值 - >鍵的新映射(即舊值變爲新鍵,舊鍵變爲新值)。「轉置」一個hash-鍵 - > value->鍵的值?
最好的辦法是做什麼? (我正在使用Java ...)。
哦,值是唯一的。
假設我有一個關鍵字 - >值對的映射,我想對此進行反轉,以便我有一個有效的值 - >鍵的新映射(即舊值變爲新鍵,舊鍵變爲新值)。「轉置」一個hash-鍵 - > value->鍵的值?
最好的辦法是做什麼? (我正在使用Java ...)。
哦,值是唯一的。
迭代entrySet
在:
for (Map.Entry<K, V> entry : map.entrySet()) {
newMap.put(entry.getValue(), entry.getKey());
}
return newMap;
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();
}
您可以使用在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
我認爲這裏有足夠的解決方案來解決您的問題。我只想指出要小心,因爲如果值不唯一,可能會導致數據丟失。 F.e.如果你有以下地圖:
A->X
B->Y
C->Y
和逆它,你將可以進行
X->A
Y->B
或
X->A
Y->C
這取決於插入的順序。通過再次反轉,您將有一個<鍵,value> pair less。
+1是唯一指出危險的人。 – whiskeysierra 2010-07-28 00:27:29
太棒了!所以如果不處理唯一值,應該將映射轉儲到多維數組並將其轉置。然後按「原樣」使用它 – Bostone 2013-03-21 15:36:16
我也是+1。 ... – 2010-07-27 20:23:01
多數民衆贊成在很酷 – aeq 2010-07-27 20:28:43
如果值是非唯一的,地圖>也可以簡單地創建使用番石榴: ImmutableMultimap.copyOf(Multimaps.forMap(map))。inverse().asMap ); –
2013-01-23 10:40:44