2010-10-28 74 views
3

我想整數映射到字符串,它們是一對的,如:在Java中使用哪個集合?

60 : c 
61 : c# 
62 : d 
63 : d# 
64 : e 
65 : f 
66 : f# 

但我需要做以下的能力:

  1. 獲取從一個值key:「c」= getValue(60)[給它一個鍵60,返回字符串值]
  2. 從鍵值獲得鍵值:65 = getKey(「f」)[給它一個字符串值「f」,返回a鍵]

哪個集合模型最適合這個?我問,因爲我已經看過其中的幾個,沒有人能做到這一點。或者我必須編寫代碼才能通過每一對來找出哪個鍵的值爲「f」?

編輯:沒有在jdk1.6做到這一點?

+0

是否每個號有一個相關的價值? – 2010-10-28 03:07:38

+0

從12到107的數字每個都與一個字符串相關聯 – Frank 2010-10-28 03:09:52

+1

「jdk1.6中沒有任何內容會執行此操作?」不。 – Thilo 2010-10-28 03:27:32

回答

0

發現這個在另一個論壇(link text

public class ReversibleMap { 
     private final Map keyToValue = new HashMap(8); 
     private final Map valueToKey = new HashMap(8); 

     public void put(Integer key, String value) { 
      keyToValue.put(key, value); 
      valueToKey.put(value, key); 
     } 

     public String get(Integer key) { 
      return (String) keyToValue.get(key); 
     } 

     public Integer getKey(String value) { 
      return (Integer) valueToKey.get(value); 
     } 
    } 

這應該做

+0

'HashMap'需要是一個'LinkedHashMap'用於雙向使用。 – 2010-10-28 07:03:04

+0

簡單和點我的問題的答案,謝謝! – Frank 2010-10-28 15:01:56

5

你需要的是一個BiMap。谷歌guava庫提供了這個集合。

6

如果您不想包含公用集合或番石榴,只需使用兩個單獨的地圖 - 您可以通過一個簡單的foreach循環以編程方式創建反向映射。我會建議設計你的代碼,以便所有對這些映射的訪問都是在一個類內部的(因爲它是一個實現細節,應該從系統的其他部分隱藏)。換句話說,不要將這些地圖傳遞給任何方法。然後,你可以很容易地切換到更適當的收集,如果你以後選擇。

1

嗨 我想插一兩件事情 Java中的標準地圖單向工作:給一鍵獲取對象(S) 我不知道一個Java JDK1.6的類,它的它

一對夫婦的想法 1)創建一個具有2個映射一個與和其他與一類,這並不難實現^^

2)如果您的數據都是喜歡你的貼如果這是一個預定義的關聯列表,爲什麼不嘗試枚舉?或一個ArrayList?

傑森

1

如果這些都是固定的一組鍵值對音符,那麼你可以考慮使用enum與反向查找地圖。你仍然會得到兩個HashMaps,但是至少它們在枚舉中連接在一起。

enum Note { 
    C("C",60), CSHARP("C#",61), D("D",62), DSHARP("D#",63); //etc.. 
    final int value; 
    final String symbol; 
    static final Map<Integer, Note> lookup = new HashMap<Integer, Note>(); 
    static { 
     for(Note n : Note.values()) { 
      lookup.put(n.value, n); 
     } 
    } 

    Note(String symbol, int value) { 
     this.symbol = symbol; 
     this.value = value; 
    } 

    static Note get(int i) { 
     return lookup.get(i); 
    } 
} 

然後得到的值和符號,用這個

System.out.println(Note.get(61)); 
System.out.println(Note.get(61).symbol); 
System.out.println(Note.CSHARP.value); 
System.out.println(Note.CSHARP.symbol); 

這將導致以

CSHARP 
C# 
61 
C# 

PS。爲簡潔起見,刪除修飾符。 PSS。爲符號添加其他查找映射。