3

2 つのハッシュマップのキーの結合を計算したいと考えています。私は次のコード(以下のMWE)を書きましたが、

UnsupportedOperationException を取得します。これを達成するために何が良いでしょうか?

import java.util.HashMap;
import java.util.Map;
import java.util.Set;


public class AddAll {

    public static void main(String args[]){

        Map<String, Integer> first = new HashMap<String, Integer>();
        Map<String, Integer> second = new HashMap<String, Integer>();

        first.put("First", 1);
        second.put("Second", 2);

        Set<String> one = first.keySet();
        Set<String> two = second.keySet();

        Set<String> union = one;
        union.addAll(two);

        System.out.println(union);


    }


}
4

3 に答える 3

7

は のコピーではunionなく、ですです。_ のキーのコピーではなく、ビューあり、 に記載されているように、追加をサポートしませんone one first.keySet()first.keySet()firstMap.keySet()

したがって、実際にコピーを行う必要があります。最も簡単な方法は、おそらく次のように書くことです

 one = new HashSet<String>(first);

HashSet同じオブジェクトを参照するだけでなく、「コピー コンストラクター」を使用して実際のコピーを行います。

于 2013-02-15T00:29:42.517 に答える
1

はマップkeySetの実際のデータであり、コピーではないことに注意してください。そこを呼び出すことができればaddAll、それらすべてのキーを値なしで最初のマップにダンプすることになります! putHashMap は、意図的に、実際のマップの型メソッドを使用して新しいマッピングを追加することのみを許可します。

union最初の hashmapL のバッキングデータではなく、おそらく実際の新しいセットになりたい

    Set<String> one = first.keySet();
    Set<String> two = second.keySet();

    Set<String> union = new HashSet<String>(one);
    union.addAll(two);
于 2013-02-15T00:31:32.447 に答える
0

代わりに以下のコードを使用してください

import java.util.HashMap;
import java.util.Map;
import java.util.Set;


public class AddAll {

    public static void main(String args[]){

        Map<String, Integer> first = new HashMap<String, Integer>();
        Map<String, Integer> second = new HashMap<String, Integer>();
        Map<String, Integer> union = new HashMap<String, Integer>();
        first.put("First", 1);
        second.put("Second", 2);
        union.putAll(first);
        union.putAll(second);

        System.out.println(union);
        System.out.println(union.keySet());


    }


}
于 2013-02-15T00:31:23.673 に答える