2012-01-06 12 views
1

を成長する際に、私の問題はHashMapのは、それを見つけることができませんArrayListのはまあ

ArrayList<Integer> array = new ArrayList<Integer>(); 

例えば私のコードの一部では、私はハッシュマップ内のキーとしてのArrayListを使用することである。そして、私は私の配列を置きますここで

HashMap<ArrayList<Integer>, String> map = new HashMap<ArrayList<Integer>, String>(); 
map.put(array, "value1"); 

(私はそれを確信している。この方法でそれを必要とする)は、ハッシュマップ内のキーのように問題が来る:私は私の配列にいくつかの値を追加して、私が使用してデータを回復しようとすると、ハッシュマップはそれを見つけることができません。この時間値で

array.add(23); 
String value = map.get(array); 

代わりに私がテストしていた文字列「VALUE1」 のnullで、私は配列リストが育つと、これは私の問題の中心点であるときのhashCodeが変更されますが、私が知りたいことを発見どうすればこの問題を解決できますか?

+0

ある要素がない私はほとんど確信しているあなたは* *それを行うにはしたくないでしょう。それはあなたが ' – Bohemian

+0

答えるいただき、誠にありがとうございます'地図<文字列、リスト>が望む可能性が高いのですが、私は、私はこの方法でそれを必要とするかなり確信している... – yuryeuceda

答えて

1

HashMapのキーとして変更可能なオブジェクト(つまり、hashCodeが変更されたオブジェクト)を使用することはできません。代わりにキーとして使用する何かを見つけることができるかどうかを確認してください。コレクションを文字列にマップするのはやや珍しいことです。それ以外の方法はずっと一般的です。

0

奇妙な使用例ですが、それをやる必要がある場合は、配列をサブクラス化してhashCodeメソッドをオーバーライドできます。

3

IdentityHashMapを使用してください。同じ配列インスタンスは、その内容(したがってハッシュコード)がどのように変更されても、常に同じ値にマップされます。

+0

はOhhhhhこれは素晴らしいです!!!!これが本当に必要なのです – yuryeuceda

0

私はほとんどあなたがそれをしたくないと確信しています。おそらく、あなたはMap<String, List<Integer>>がほしいと思うでしょう。ただし、場合は、絶対に、これを行う必要があり、ホルダークラスを使用します。

public class ListHolder { 
    private List<Integer> list = new ArrayList<Integer>(); 
    public List<Integer> getList() {return list;} 
} 

Map<ListHolder, String> map = new HashMap<ListHolder, String>; 
+0

これは実際には機能しません - 一般的なオブジェクトの配列を作成することはできません。ホルダークラスがより適切でしょう。 – Natix

0

その私の意見で試してみて、行うには、追加の事を少し。

私が何をモデルにしようとしていることn個整数で構成された可変長の鍵であると仮定し、かつArrayListのハッシュが一致しているだろうと仮定し、私はそのような場合はわかりません。

私はあなたのいずれかのサブクラスArrayListとはhash() & equals()メソッドをオーバーライドし、またはキークラスでHashMapをラップすることをお勧めします。

0

基本的な理由:HashMap.put(k、v)を使用すると、k.hashCode()を数字で置き、どこに配置するかを知ることができます。

そしてそれはまた、この番号で値を見つける(k.hashCode());

あなたはArrayList.hashCode()関数を参照してくださいすることができ、それがAbstractListの抽象クラスです。明らかに、オブジェクトを追加すると、haseCodeの値が変更されます。だから我々は、値の使用HashMap.get(K)を見つけることができないとhashCodeはK.

public int hashCode() { 
    int hashCode = 1; 
    for (E e : this) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
    return hashCode; 
} 
関連する問題