6

同じキーを持つ値を(リストに)グループ化するHashMapを作成する方法を考えるのに苦労していました。これは私が意味することです:

次のキーと値があるとします。

Value     Key  *Sorry I got the columns swapped
1         10 
1         11 
1         12 
2         20 
3         30 
3         31 

これらの値を

Hashmap <Integer, List<Integer>>

値を同じキーを持つListIntegerにグループ化するために、次のようになります。

(1、{10、11、12})、(2、{20})、(3、{30,31})

現在、キーと値はに保存されています

Hashmap <Integer, Integer>

そして、このハッシュマップをループして、キー:ListofValuesペアを使用して新しいハッシュマップを作成する方法に迷いました。誰かがこのトピックに良いアプローチを持っていますか?

4

4 に答える 4

10

を作成しHashMap<Integer, List<Integer>>、要求した方法でキーと値のペアを追加したい場合は、次の方法を使用できます。

public void addToMap(HashMap<Integer, List<Integer>> map, Integer key, Integer value){
  if(!map.containsKey(key)){
    map.put(key, new ArrayList<>());
  }
  map.get(key).add(value);
}

サンプルデータでこのメソッドを使用する:

HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
addToMap(map, 1, 10); 
addToMap(map, 1, 11);
addToMap(map, 2, 20);
addToMap(map, 3, 30);
addToMap(map, 3, 31);
于 2013-02-27T15:41:04.340 に答える
8

単純な使用の代わりにMapGoogleGuavaのMultimap

AMultimap

... Mapと同様に、キーを値にマップするコレクションですが、各キーは複数の値に関連付けられている場合があります。

この概念はもちろん他のライブラリにも実装されています。Guavaは私の個人的な好みです。

于 2013-02-27T15:37:14.183 に答える
1

HashMapは、整数ごとに1つの値のみを格納します。したがって、それを繰り返すと、次の値しか得られないはずです。

Key      Value 
1         12 
2         20 
3         31 

マップのコンテンツを反復処理するには、 entrySet()メソッドを使用できます。

for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

リストのマップを作成するには、次のことをお勧めします。

List<Integer> list = map.get(key);
if(list == null) {
    list = new ArrayList<Integer>();
    map.put(key, list);
}
list.add(value);
于 2013-02-27T15:46:28.423 に答える
0

ととHashMap<Integer,Integer>同じキーを持つ2つのペアを保存できないため、実際の状況は機能しません。1,101,11

独自のマルチマップを簡単に開発できますが、そのためにすでに開発されているクラスを使用するのが最善です。ApacheCommonsフレームワークには、MultiValueMap<K,V>すでに用意されているクラスがあります。

于 2013-02-27T15:38:13.870 に答える