2012-05-09 120 views
2

是否可以創建一個HashMap,其鍵是一個整數數組?具有多個值的密鑰的HashMap

我習慣於使用Python,最近我開始使用Java。在我的工作中,我需要創建一個帶有諸如以下鍵的HashMap:

map.put([5,2], 1); 
map.put([3,2], 0); 

等等。我用它來測試地圖中是否有一對數字,如果是,那麼做一些事情,如果沒有,繼續。

爲此我嘗試了以下內容:

Map<Array, Boolean> test = new HashMap<Array, Boolean>(); 
int[] a1 = {5,2}; 
test.put(a1, true); 

Eclipse中給人的消息( 「的觀點並不是適用於INT [] ...」)。但是我做的任何配置都會出現一些錯誤。我嘗試使用ArrayList,地圖內的對象,嵌套的HashMap等,但沒有工作(在python中很容易,我只是寫dict [(5,2)] = 1,所以我想像在Java中有這樣簡單的東西)。我建議到數字轉換成字符串,並添加然後之間的冒號,如:

map.put("5:2", 1); 

,後來我再次突破字符串,但如果這是解決方案I'll回到Python的;)!

大概這是一個非常簡單的問題,但我找不到答案,希望你能幫助我。

在此先感謝!

+1

如果你總是隻需要2個整數作爲地圖中的關鍵字,那麼最好的解決方案是用2個整數和一個散列函數創建你自己的類,然後使用該類的實例作爲關鍵。 – MTilsted

回答

2

如果您要檢查您的項目是否存在等,你可以使用一個Set(有用的具體實現是HashSet

final Set<List<Integer>> population; 

population = new HashSet<List<Integer>>(); 
population.add(Arrays.asList(1, 2)); 

if (population.contains(Arrays.asList(1, 2))) 
{ 
    ... 
} 

您可以使用List因爲我在上面所做的 - 但沒有按不能保證所有的列表都是兩個元素長(如果這確實是一個約束)爲了使它更健壯,你可以創建自己的類來表示元組,如果你這樣做的話,確保你實現了equals()hashCode()(這裏是article explaining good practice)。

Arrays.asList()是在代碼中創建內聯列表的有用方法。更通用的列表是ArrayList

+0

令人驚歎!非常感謝你們所有人的答案!那麼我已經嘗試過這一個,工作得很好。我仍然不明白爲什麼需要實現equals()和hashCode(),但我肯定會研究它! Tnx =)!! –

+0

對於散列數據結構('HashSet','HashMap'),使用'hashCode()'將對象分佈在存儲桶中。 'equals()'用於確保在散列衝突的情況下確保該對象確實是請求的對象。因此,兩者都必須實施並遵守這樣的規則:如果對象相同,則它們也必須具有相同的哈希碼才能工作。 –

0

實際上java比python表現力差得多,所以你必須編寫更多的代碼。

我認爲你需要以下列方式使用地圖與ArrayList

ArrayList al = map.get("key"); 
if (al == null) { 
    al = new ArrayList(); 
    map.put("key", al) 
} 
al.add(some_object); 

您也可以使用數組作爲鍵(如你要求的),也許你想要一個不可改變的陣列。哈希映射工作的關鍵是使用一些對象,它具有良好的實現equalshashCode

這是在java中完成的方式,雖然可以使用任何類型的集合,但集合更常見。

乾杯!

1

這工作:

Map<List<Integer>,Boolean> map = new HashMap<>(); 
map.put(Arrays.asList(new Integer(1), new Integer(2)), false); 
map.put(Arrays.asList(4, 5), true); // Integer type is inferred and ints are autoboxed 

map.get(Arrays.asList(1, 2)); // gets the Boolean object for "false" 
2

最簡單的事情將是一個Map<List<Integer>, Boolean> - 甚至只是一個Set<List<Integer>>,因爲你不關心價值不亞於是否的關鍵是存在的。

的多個Java-Y解決方案將是一些類,它表示兩個整數:

public class Coordinate { // or whatever 
    private final int x; 
    private final int y; 

    // constructor and overrides for equals, hashCode and toString 
} 

然後有一個Set<Coordinate>

這被認爲是更通俗的Java,因爲類名告訴你這個集合是什麼 - 並強制它以這種方式使用。另一方面,一個Set<List<Integer>>,可能是很多的東西:座標,彩票挑選,特定部門的人的SSNs,付款的信用卡......你只是通過查看類型,程序員無法知道,而且對於意外事件在另一個環境中意外使用的一組數字很容易。 A Set<Coordinate>只能是一組座標。

+0

我同意,Set 是一個很好的面向對象的解決方案 –