2013-08-22 37 views
0

我想編寫一個方法,該方法將地圖作爲參數,並用值和鍵替換該地圖的鍵和值。我試圖做這樣的:如何使用地圖的值鍵替換鍵值

public class HashMapKeyValueInterchange{ 
     public static Map<String, String> getMyMap(ConcurrentHashMap<String, String> m){ 
      Map<String, String> map2 = new HashMap<String, String>(); 
      for(Entry<String, String> e:m.entrySet()){ 
       map2.put(e.getValue(), e.getKey()); 
      } 
      return map2; 
     } 

     public static void main(String[] args) { 
      ConcurrentHashMap<String, String> map1 = new ConcurrentHashMap<String, String>(); 
      map1.put("ajay", "btech"); 
      map1.put("manas", "mca"); 
      map1.put("ashu", "mba"); 
     }  
} 

使用這種方法,我可以得到一個新的地圖(MAP2)與交換的密鑰和價值觀,但我想MAP1進行交換

+0

問題是什麼? – BobTheBuilder

+1

使用類HashMapKeyValueInterchange的代碼在哪裏? –

+0

IMO你做了什麼看起來不錯。我不認爲有更好的辦法! – sanbhat

回答

2

這是速效,無需要重新發明輪子,如果你使用谷歌收藏庫番石榴然後你可以使用BiMap<K,V>

它是一張保存其值的唯一性的地圖,以及它的關鍵字 。這個限制使bimaps支持一個 「反向視圖」,這是另一個bimap,包含與這個bimap相同的條目,但是具有相反的鍵和值。

BiMap實現是EnumBiMap, EnumHashBiMap, [HashBiMap][2], ImmutableBiMap

+0

Seema對我來說像番石榴改造了這裏的輪子,請參閱http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/BidiMap.html – oddparity

0

如果問題是,如果代碼工作,答案是肯定的。一些評論:

  1. 如果你想測試你的代碼,你需要調用getMyMap與map1或其他適當的參數。
  2. 如果你想看到任何輸出,你需要寫像System.out.println(getMyMap(map1));
  3. 我強烈建議使用Map代替ConcurrentHashMapgetMyMap的第一個參數的類型,所以該功能是與其他一般的作品地圖。
  4. 爲了讓更多的普通代碼,使其:

    public static <K,V> void getMyMap(Map<V,K> output,Map<K,V> input) { 
        for(Entry<K,V> e: input.entrySet()) { 
         output.put(e.getValue(), e.getKey()); 
        } 
    } 
    

    這將接受更大的各種Map的並存儲在任何類型的Map輸出作爲第一個參數傳遞。例如:

    getMyMap(new TreeMap<String,String>(),map1); 
    getMyMap(new HashMap<String,String>(),map1); 
    

的最後一點是,重複值時,你不指定行爲。上面的假設是,這種情況不會發生,或者輸入映射中的任何鍵都可以接受爲輸出映射中的值。

0

使用此代碼

public static ConcurrentHashMap<String, String> getMyMap(ConcurrentHashMap<String, String> m){ 
     ConcurrentHashMap<String, String> map2 = new ConcurrentHashMap<String, String>(); 
     for(Entry<String, String> e:m.entrySet()){ 
      map2.put(e.getValue(), e.getKey()); 
     } 
     return map2; 
} 
public static void main(String[] args) { 
    ConcurrentHashMap<String, String> map1 = new ConcurrentHashMap<String, String>(); 
    map1.put("ajay", "btech"); 
    map1.put("manas", "mca"); 
    map1.put("ashu", "mba"); 
    map1 = getMyMap(map1); 
} 
0

BIMAP是這種操作的一個不錯的選擇

一個BIMAP是一個地圖, 讓您與逆查看「逆」 BIMAP () 確保值是唯一的,使得值()a集合

BiMap.put(key, value)將拋出IllegalArgumentException如果您嘗試將鍵映射到一個已經存在的值。如果您希望刪除具有指定值的任何預先存在的條目,請改爲使用BiMap.forcePut(key, value)

BiMap<String, Integer> userId = HashBiMap.create(); 
String userForId = userId.inverse().get(id); 

here瞭解更多信息