2011-02-17 62 views
6

我需要創建一個具有兩個字符串鍵的映射。地圖中兩個字符串的鍵?

例如讓說

key = Name & Target 
value = Permission(boolean) 

我需要創建一個特殊的對象或者是在有任何的元組構建的Java /谷歌集合或共享集合或共享郎?

回答

10

的Apache Commons Collections中有MultiKey

map.put(new MultiKey(key1, key2), value); 

MultiKeyMap

multiKeyMap.put(key1, key2, value); 
+0

一個很好的發現,thx。 – IAdapter 2011-02-17 09:41:59

1

這是你在找什麼?

String name = ... 
String target = ... 
String key = name + "_" + target; 

map.put(key, value) 

另外,您可以創建一個容納兩個字符串對象和覆蓋hashCodeequals例程比簡單的字符串連接一個更好的辦法來區分。

+0

這可能不是最好的解決方案,name ='ab'和target ='c'將指向與name ='a'和target ='bc'相同的條目。不完美的解決方案,但這些字符串可以由一些不尋常的字符串分隔 – 2011-02-17 09:27:29

5

爲什麼不創建List從這兩個字符串,並使用作爲Map中的一個鍵。它會使代碼更具可讀性。

+0

請發表一個建議的解決方案的工作示例,它可以得心應手的進一步參考 – Deepak 2011-02-18 15:29:34

3

你能貓的串在一起,但我個人的偏好是創建一個價值不大的對象:

public class NameTarget { 
    private final String name; 
    private final String target; 

    public NameTarget(String name, String target){ 
     this.name = name; 
     this.target = target; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     result = prime * result + ((target == null) ? 0 : target.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     NameTarget other = (NameTarget) obj; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     if (target == null) { 
      if (other.target != null) 
       return false; 
     } else if (!target.equals(other.target)) 
      return false; 
     return true; 
    } 

    // add getters here 
} 

花了大約30秒鐘來產生d o在eclipse中,它爲長期運行提供了更安全,更乾淨的代碼。

你可以和我在過去創建了一個Pair樣式turple但我開始喜歡這種事情的命名不可變值類型。

+0

可以確認30秒 - 你手動編寫一個包名,一個類名和兩個屬性,剩下的就是自動生成的eclipse(構造函數,getter,setter,hashcode的實現,toString和等於) – 2011-02-17 09:36:37