2016-05-09 3 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' сырой тип? ** Никогда ** используйте rawtypes. –

ответ

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

Во-вторых, программа для интерфейсов, а не реализации. Другими словами, программа использует интерфейсы Map и List, а не реализации HashMap и ArrayList. Это хорошо известный принцип программирования 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 (« Тесты », k -> новый ArrayList <>())', для следующего вопроса «почему я получил« NullPointerException »с другим ключом». –

+0

@BoristheSpider ничего себе я не знал этого. Был ли он представлен на Java 8? Также есть ли для 'put'? – dabadaba

+0

@dabadaba, да - как есть лямбда. Что бы сделать «положить» точно? –

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" 

Это означает, что если карта не содержит запись для key, он будет использовать предоставленную лямбду, чтобы создать новое значение для ключа и вернуть его.

+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

Мне нравится однострочный (от второй до последней строки). – Jan

Смежные вопросы