2010-07-27 30 views
4

假設我有一個關鍵字 - >值對的映射,我想對此進行反轉,以便我有一個有效的值 - >鍵的新映射(即舊值變爲新鍵,舊鍵變爲新值)。「轉置」一個hash-鍵 - > value->鍵的值?

最好的辦法是做什麼? (我正在使用Java ...)。

哦,值是唯一的。

回答

12

個人而言,我會使用一個番石榴BiMap下手(與諸如HashBiMap實現),然後調用inverse()時,我想使用的值作爲鍵:)

+0

我也是+1。 ... – 2010-07-27 20:23:01

+0

多數民衆贊成在很酷 – aeq 2010-07-27 20:28:43

+0

如果值是非唯一的,地圖>也可以簡單地創建使用番石榴: ImmutableMultimap.copyOf(Multimaps.forMap(map))。inverse().asMap ); – 2013-01-23 10:40:44

5

迭代entrySet在:

for (Map.Entry<K, V> entry : map.entrySet()) { 
    newMap.put(entry.getValue(), entry.getKey()); 
} 
return newMap; 
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(); 
} 
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 
6

我認爲這裏有足夠的解決方案來解決您的問題。我只想指出要小心,因爲如果值不唯一,可能會導致數據丟失。 F.e.如果你有以下地圖:

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

和逆它,你將可以進行

X->A 
Y->B 

X->A 
Y->C 

這取決於插入的順序。通過再次反轉,您將有一個<鍵,value> pair less。

+0

+1是唯一指出危險的人。 – whiskeysierra 2010-07-28 00:27:29

+0

太棒了!所以如果不處理唯一值,應該將映射轉儲到多維數組並將其轉置。然後按「原樣」使用它 – Bostone 2013-03-21 15:36:16