2

配列と配列リストをマップのキーとして配置しようとすると、この問題が発生します。最初のコード:

        LinkedHashMap<ArrayList<String>, String> lhm = new LinkedHashMap<ArrayList<String>, String>();
    for (int i =0;i < strs.length; i++){
        ArrayList<String> arr = new 
            ArrayList<String>(Arrays.asList(strs[i].toLowerCase().split(" "))); 
        Collections.sort(arr);
        lhm.put(arr, strs[i]);
    }

2 番目のコード:</p>

LinkedHashMap<String[], String> lhm = new LinkedHashMap<String[], String>();
for (int i =0;i < strs.length; i++){
    String[] str = strs[i].toLowerCase().split(" ");
        Arrays.sort(str);
        System.out.println("***********");
        for (String strin :str)
        {
            System.out.println(strin);
        }
        System.out.println("***********");
        lhm.put(str, strs[i]);
    }

最初のコードは期待どおりに機能し、重複したキー (同じ内容のキーとして Arraylist) を配置するたびに、前のキーの値をオーバーライドします。しかし、2番目の部分は期待どおりに機能しません。すべての値をそこに入れるだけです。誰でもこれがどのように機能するか説明できますか? そして、Array/ArrayList(またはコレクションをキーとして)を置くことは良い習慣ですか?

4

1 に答える 1

5

Javaの配列は、Objectから継承されたデフォルトのequalsメソッドを使用します。hashCodeメソッドについても同様です。したがって、キーと同じ要素を持つパッティング配列であっても、「重複」が発生することになります。一方、リストは、ハッシュコードメソッドをオーバーライドして、その内容をより代表する値を返します。

いずれにせよ、ハッシュマップのキーとして可変オブジェクトを使用することは一般的に悪い考えですが、場合によっては避けられないこともあります。特にコレクションをキーとして使用すると、さまざまな方法でつまずく可能性があります。

  • リストに要素を追加する
  • ハッシュコード/等価コントラクトが変更される方法で、リスト内のオブジェクトを変更する
于 2013-02-20T23:39:04.793 に答える