2017-05-29 9 views
1

値リストを拡張できるマップを作成するにはどうすればよいですか。たとえば、キーAと値B {1,2,3}のリストを含むマップがあります。次に、プログラム実行中のある時点で、私はリストBにもっと価値のあるex:4を追加したいと思います。今度は新しいマップは(A、{1,2,3,4})のようになります。どうやってやるの?Javaの単一キーに複数の値を追加する方法

+2

'map.get( "A")(マップ値は、文字列のArrayListのである)を追加します。 (4); – QBrute

答えて

6

Map<K,V>は、あなたがタイプList<T>であることがVを必要とし、1つの値に一つのキーをマッピングしているので:そのようなタイプを持っていることの

Map<String,List<Integer>> multiMap = new HashMap<>(); 

1つの結果は今のキーに項目を追加するプロセスが構成されていることです2つのステップ:キーのリストが存在するかどうかをチェックする必要があります。その後、いずれかの既存のリストに新しい項目を追加、または単一アイテムに新しいリストを追加します。

List<Integer> current = multiMap.get(key); 
if (current == null) { 
    current = new ArrayList<Integer>(); 
    multiMap.put(key, current); 
} 
current.add(val); 

は、Java 8を使用する場合、 computeIfAbsentを使用して大幅にコードを簡素化:

multiMap.computeIfAbsent(key, k -> new ArrayList<>()).add(value); 
+4

最新の 'computeIfAbsent'メソッドを使って実装を単純化することができます:' multiMap.computeIfAbsent(key、k - > new ArrayList <>())。add(value); ' –

+0

@MalteHartwig Right、Java 8はこの便利なオプションを追加し、操作の可読性を大幅に向上させました。ありがとうございました! – dasblinkenlight

+0

@MalteHartwig:うわーありがとう!これはJava 8で素晴らしい見た目になります! – Sonn

2

このようなコレクションはすでに実装されています。 Multimap from Guavaをご覧ください。自転車をゼロから作り上げてはいけません。

希望すると助かります!

3

は、新たな一時変数を使用して、新しい整数を追加し、これに チェックは助けかもしれない説明しています。

Map<String, List<Integer>> map = new HashMap<String, List<Integer>>(); 
    List<Integer> list = new ArrayList<Integer>(); 
    list.add(1); 
    list.add(2); 
    list.add(3); 

    map.put("A", list); 
    map.forEach((key,value)->System.out.print(key + " : "+ 
    value)); 
    List<Integer> newList = (ArrayList<Integer>)map.get("A"); 
    newList.add(4); 
    System.out.println(); 
    map.put("A", newList); 
    map.forEach((key,value)->System.out.print(key + " : "+ 
      value)); 
0

より一般的な解決策は、 は、例えば値のような任意のコレクション型を提供するマルチマップクラスを有することですArrayList: 私は数週間前にJava-Bookでこれを見つけました。例:

class MultiMap<K, V> 
{ 
    private final Map<K,Collection<V>> map = new HashMap<>(); 

    public Collection<V> get(K key) 
    { 
    return map.getOrDefault(key, Collections.<V> emptyList()); 
    } 
    public void put(K key,V value) 
    { 
    map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); 
    } 
} 

使用法かもしれ:これは役立ちます

MultiMap<Integer,String> map = new MultiMap<>(); 
int id = 34; 
System.out.println(map.get(id)); // creates an ArrayList<String> for key 34 

map.put(id,"first value for 34"); 
System.out.println(map.get(id)); // [first value for 34] 

map.put(id,"second"); 
System.out.println(map.get(id)); // [first value for 34, second] 

希望...

関連する問題