この地図がありますMap<String, Set<Integer>> myMap;
、今、それを操作する必要があります。どうすればよいですか?
キーは:「アップル」、「オレンジ」、「ブドウ」など.
各セットには乱数が含まれます: 1-9
キーの文字列と値のセットを持つマップ(HashMapまたはTreeMap)を作成する必要があります。キーを指定してセットを返す必要があります。また、キーに基づいて各セットに複数の数字を入力できるようにする必要もあります。この問題へのアプローチ方法がわからない。何かご意見は?
正しく理解できれば、難しいことではありません。
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");
覚えておくべきことは、値は最初は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チェックコードは不要になりました。
-
セットに追加するときにnullエントリの問題に対処するには:
_map.computeIfAbsent( key, k -> new HashSet<>() ).add(number);
_
そしてヌルセーフチェックのために:
_if ( map.getOrDefault(key, Collections.emptySet() ).contains(number))
_
これを見てみませんか:
https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap
MultiMap
を使用すると、特定のキーの複数の値を非常に効率的な方法で格納できます。
あなたの場合、大きな利点は、いくつかの値を追加するために、特定のキーから値(Set
)を取得する必要がないことです。
実際、「monovalue」を処理するかのようにキーに値を追加するだけで、バックグラウンドでset
に自動的に追加されます。
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");
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行。
これは単なるフルクラスの例です。実行して、この問題について理解を深めるだけです
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());
}
}
Map<String,Set<Integer>> map;
Set<Integer> set = map.get("Apple");
OPはセットをmap
する方法、つまり値であるため、get
の実際の母集団は省略します。