web-dev-qa-db-ja.com

マップ内のセットに値を追加するにはどうすればよいですか?

この地図がありますMap<String, Set<Integer>> myMap;、今、それを操作する必要があります。どうすればよいですか?


例えば:

キーは:「アップル」、「オレンジ」、「ブドウ」など.
各セットには乱数が含まれます: 1-9

キーの文字列と値のセットを持つマップ(HashMapまたはTreeMap)を作成する必要があります。キーを指定してセットを返す必要があります。また、キーに基づいて各セットに複数の数字を入力できるようにする必要もあります。この問題へのアプローチ方法がわからない。何かご意見は?

9
user2242203

正しく理解できれば、難しいことではありません。

Map<String, Set<Integer>> reqdMap = new HashMap<String, Set<Integer>>();

//Form the set corresponding to Apple.
Set<Integer> appleSet = new HashSet<Integer>();
appleSet.add(1);
...


reqdMap.put("Apple", appleSet);

//To Retrieve
appleSet = reqdMap.get("Apple");
13
prashant

覚えておくべきことは、値は最初はnullであるため、キーを初めて使用するときは、キーを初期化する必要があります。

_Map<String,Set<Integer>> map;  
_

キーに番号を追加するには、次の操作を行う必要があります。

_String key = "Apple"; // for example 

Set<Integer> set = map.get(key); 
if (set == null) {
    set = new HashSet<Integer>();
    map.put(key, set);
}
set.add(5);
_

残念ながら、セットを操作するすべての場所で、nullチェックを行う必要があります。たとえば、特定のキーに特定の番号がマッピングされているかどうかを確認する場合、これを安全に行うことはできません。

_if (map.get(key).contains(number))  // not safe
_

get()を呼び出すとnullが返され(キーのエントリがない場合)、NullPointerExceptionが返されるためです。

get()を呼び出すと常にnull以外のセットが返されるように、マップ内でnullチェックを内部化することにより、マップを非常に使いやすくする方法があります。 get()を適宜オーバーライドする匿名クラスを作成します。

_Map<String,Set<Integer>> map = new HashMap<String,Set<Integer>> () {
    @Override
    public Set<Integer> get(Object key) {
        Set<Integer> set = super.get(key); 
        if (set == null) {
            set = new HashSet<Integer>();
            put(key, set);
        }
        return set;
    }
}
_

これを実行すると、メインコードがはるかに単純かつ明確になります。たす:

_map.get(key).add(number);
_

チェックする:

_if (map.get(key).contains(number)) // now safe
_

Nullチェックコードは不要になりました。

-

Java 8アップデート:

セットに追加するときにnullエントリの問題に対処するには:

_map.computeIfAbsent( key, k -> new HashSet<>() ).add(number);
_

そしてヌルセーフチェックのために:

_if ( map.getOrDefault(key, Collections.emptySet() ).contains(number))
_
10
Bohemian

これを見てみませんか:

https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap

MultiMapを使用すると、特定のキーの複数の値を非常に効率的な方法で格納できます。

あなたの場合、大きな利点は、いくつかの値を追加するために、特定のキーから値(Set)を取得する必要がないことです。

実際、「monovalue」を処理するかのようにキーに値を追加するだけで、バックグラウンドでsetに自動的に追加されます。

4
Mik378
Map<String, Set<Integer>> mapOfSets = new HashMap<String, Set<Integer>>();
Set<Integer> numberSet = new HashSet<Integer>();

//put a set into the map
mapOfSets.put("key", numberSet);
//get a set out of the map
Set<Integer> set = mapOfSets.get("key");
0
Jainathan Leung

1つの方法で複数の数値をセットに追加する場合は、次のことを試してください。

Map<String, Set<Integer>> map; // Definition


public void addValues(String key, Integer... values) {
    map.get(key).addAll(values);
}

このように、キーに一連の数字を追加する必要がある場合は、次のように呼び出すことができます。

addValues("Apple", 1, 2, 4, 6, 8);

5行ではなく1行。

0
Rob Watts

これは単なるフルクラスの例です。実行して、この問題について理解を深めるだけです

public class Tester5 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //"Apple", "orange", "grape", etc. Each set will contain random numbers: 1, 2, 3, 4, 5, 6, 7, 8, 9

        Random ran = new Random();

        Map<String, Set<Integer>> map= new HashMap<String, Set<Integer>>();
        String keys[]= {"Apple", "orange", "grape"};
        for(String key : keys) {
            Set<Integer> integers= new HashSet<Integer>();
            for(int i = 0; i < 10; i++) {
                 integers.add(ran.nextInt(9)+1);
            }
            map.put(key, integers);
        }
        System.out.println(map.toString());

    }

}
0
Festus Tamakloe
Map<String,Set<Integer>> map;  
Set<Integer> set = map.get("Apple");  

OPはセットをmapする方法、つまり値であるため、getの実際の母集団は省略します。

0
Cratylus