2013-03-18 118 views
1

在Java中,我有一個類:HashMap對象鍵

public static class Key { 

    int[] vector = null; 

    private int hashcode = 0; 

    Key (int[] key) { 
     vector = new int[key.length]; 
     // here is the problem 
     System.arraycopy(key, 0, vector, 0, key.length); 
    } 

    public int hashCode() { ... } 

    public boolean equals(Object o) { ... } 

} 

充當在HashMap<Key, int[]> map的關鍵。在代碼中,我做的事:

// value int[] array is filled before 
map.put(new Key(new int[] {5, 7}), value); 

但是,這將創建一個參數數組{5, 7}兩次 - 當Key構造函數被調用一次,然後該構造函數裏面。

我不能使用HashMap<int[], int[]> map,因爲那麼不清楚hashCode將用於int[]。所以我在Key類中封裝了int[]密鑰。

如何才能創建一個參數數組(可以是不同的大小)一次?

我不喜歡這樣的解決方案:

map.put(new Key(5, 7), value); 

// and rewrite the constructor 
Key (int a1, int a2) { 
    vector = new int[2]; 
    vector[0] = a1; 
    vector[1] = a2; 
} 

因爲通常一個參數陣列可以是各種尺寸。

+0

爲什麼你不能分配數組到矢量成員?像這個Key(int [] keys){this。vector = keys; }解決方案的缺點是可以從該類之外修改關鍵值。 – Delta 2013-03-18 01:28:52

回答

3

如何才能創建一個參數數組(可以是不同的大小)一次?

不幸的是,你不能這麼做,因爲沒有辦法使內置的Java數組不可變。如果有可能使不變陣列,下面的工作:

Key (int[] key) { 
    // Do not do this!!! 
    vector = key; 
} 

雖然上面將工作中充分合作的環境,惡劣的用戶可以通過一個數組,並讓鍵計算散列,然後更改陣列將錯誤引入您的代碼的元素。這就是爲什麼你是絕對正確的,當你決定在通過陣列複製

您可以更改函數接受可變數量的參數,像這樣:

Key (int ... key) { 
    vector = new int[key.length]; 
    System.arraycopy(key, 0, vector, 0, key.length); 
} 

這將讓你創建陣列含蓄而除了明確:

map.put(new Key(5, 7), value); 
1

使用varargs的參數和使用Arrays.copyOf()

Key (int... key) { 
    vector = Arrays.copyOf(key, key.length); 
} 

現在,您可以撥打任何號碼,如果int參數(包括無參數)構造函數,它不會導致錯誤。

1

由於arraycopy被用來從一個對象做一個深拷貝到另一個,在某些時候,你需要創建兩個對象,其中第二個是尺寸參數數組一樣。所以vector = new int[key.length];看起來是正確的。

順便說一句,當我編譯代碼我得到一個錯誤static不是類有效修改,只有publicabstract,或final是。