2016-05-09 13 views
0

夜!マップの既存のキーにリストに値を追加する

私は以下の地図を持っている:

HashMap<String, ArrayList> myMap = new HashMap<String, ArrayList>(); 

私はそれに次のデータを追加しました:

キー:テスト

ArrayList myList = new ArrayList(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

これは、次のデータを私に残さ


値:テスト1、テスト2、テスト3

私の質問はどのように私はその後、私の既存のキーへの上に新しい値を追加します、ありますか?たとえば、キー "テスト"に "テスト4"の値を追加するにはどうすればいいですか?

ありがとうございました。

+1

'myMap.get(" Test 4 ")' – dabadaba

+3

なぜあなたの 'ArrayList'は生の型ですか? **決してrawypeを使用しないでください。 –

答えて

3

単にマップからリストを取得し、リストに要素を追加します。

ArrayList list = myMap.get("Tests"); 
list.add("Test4"); 

あなたのコードについて述べすることができますいくつかの他のものがあります。まず、don't use the raw typeArrayList。使用ジェネリック:

HashMap<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>(); 

ArrayList<String> myList = new ArrayList<String>(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

第二に、インタフェースではなく、実装するプログラム。換言すれば、HashMapおよびArrayListの実装ではなく、MapおよびListのインタフェースを使用するプログラムです。これはよく知られているOOプログラミングの原則であり、必要に応じて異なる実装に簡単に切り替えることができます。最後に

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

List<String> myList = new ArrayList<String>(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

、構文のヒント:あなたは、Java 7以降を使用している場合は、<>を使用することができますし、型引数繰り返す必要はありません。私が使用してお勧めしたい

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

List<String> myList = new ArrayList<>(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

myMap.get("Tests").add("Test 4"); 
+2

あるいは「myMap.computeIfAbsent( "Tests"、k - > new ArrayList <>()) 'の次の質問については、"別のキーでNullPointerExceptionを取得したのはなぜですか? –

+0

@BoristheSpiderうわー、私はこれを知らなかった。それはJava 8で導入されましたか? 'put'にも同様のものがありますか? – dabadaba

+0

@dabadaba、はい - それはラムダを持っています。 'put 'のものは何をするのでしょうか? –

4

Map#computeIfAbsent、常にマップからListを取得することを確認します

private final Map<String, List<String>> example = new HashMap<>(); 

private List<String> getList(String key) { 
    return this.example.computeIfAbsent(key, k -> new ArrayList<>()); 
} 

//elsewheres 
getList("test").add("foobar"); 
getList("test").forEach(System.out::println); // "foobar" 

これは、そのマップはのエントリが含まれていない場合では、提供されたラムダを使用してキーの新しい値を生成し、それを返します。

+1

しかし、それはマップの値を入れている? ** getter **メソッドを使用している場合は、データをコレクションに入れるというアイデアが気に入らないと思います。 – dabadaba

+0

それが欠けている場合は値を置きます、あなたはデフォルトしているという考えです。そのリソースが利用できない場合、そのリソースを作成して新しいリソースを提供します。完璧に有効です。 – Rogue

1
import java.util.*; 

class M { 
    public static void main(String ... args) { 
     List<String> l = new ArrayList<>(); 
     l.add("Test 1"); 
     l.add("Test 2"); 
     l.add("Test 3"); 

     Map<String,List<String>> m = new HashMap<>(); 
     m.put("Tests", l); 

     // some time later that day ... 
     m.computeIfAbsent("Tests", k -> new ArrayList<>()).add("Test 4"); 
     System.out.println(m); 
    } 
} 
+0

私は1ライナーが好きです(2行目から最後の行まで)。 – Jan

関連する問題