13

私はこのマップを持っていますMap<String, Set<Integer>> myMap;。今、それを操作する必要があります。どうすればよいですか?


例えば:

キーは、「りんご」、「オレンジ」、「ぶどう」などです。各セットには、 1 ~ 9
の乱数が含まれます。

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

4

7 に答える 7

16

値は最初は 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、.

マップ内の null チェックを内部化することで、マップを非常に便利に使用できるようにする方法がありますget()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 チェック コードは不要になりました。

——</p>

Java 8 の更新:

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

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

nullセーフチェックの場合:

if ( map.getOrDefault(key, Collections.emptySet() ).contains(number))
于 2013-04-03T22:15:20.480 に答える
15

Not difficult if I understand correctly.

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");
于 2013-04-03T20:33:16.130 に答える
4

これを見てみませんか:

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

MultiMap特定のキーの複数の値を非常に効率的な方法で保存できます。

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

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

于 2013-04-03T20:34:30.120 に答える
0
Map<String,Set<Integer>> map;  
Set<Integer> set = map.get("apple");  

mapOPはgetセットへの方法、つまり値であるため、実際の人口は省略します

于 2013-04-03T20:30:56.750 に答える
0
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");
于 2013-04-03T20:32:46.027 に答える
0

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 行。

于 2013-04-03T20:34:19.463 に答える
0

これは完全なクラスの例にすぎません。この問題についてさらに理解するには、実行して作業するだけです

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());

    }

}
于 2013-04-03T20:39:45.333 に答える