2014-11-04 3 views
-2

Мне было интересно, если бы был более эффективный способ добавить элемент в список внутри хэш-карты вместо того, чтобы делать копию списка, добавляя этот элемент в список копирайтеров, а затем сделать положить внутрь карты с определенным ключом, связанным к списку перезаписать эту карту часть расположения ...Java: добавьте элемент в список внутри HashMap

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


....add function 

List <Object> tmp = new LinkedList(); 
if (myMap.containsKey(myListKey.hashCode())) { //keycheck 
    tmp = myMap.get(myListKey.hashCode());  //copy 
    tmp.add(myObjectToAdd);     //add 
    myMap.put(myListKey.hashCode(), tmp);  //overwrite 
} 

Я попробовал несколько способов, чтобы получить прямой доступ к внутреннему списку, но компилятор, кажется, на ее/его период сегодня ...

+6

Почему вы используете 'hashCode()' как ключ? Это просто * прошу * за неприятности. И что заставляет вас думать, что ваш текущий код * копирует * список вообще? Это просто выборка ссылок. (Вам не нужно 'put' в конце ...) Время узнать больше о хэш-кодах и ссылках, IMO. –

ответ

4

Во-первых, нет причин, по которым вы должны звонить hashCode() для размещения элементов в списке. С одной стороны, разные ключи могут иметь один и тот же хэш-код, что приведет к поведению, которое вы, вероятно, не хотите. Просто используйте ключи как ключи. A HashMap внутренне использует хэш-код ключа для эффективного выполнения операций get/put.

Ваша функция должна добавить выглядеть следующим образом:

Map<ListKeyType, List<Object>> myMap = ... 

... add function 

List<Object> tmp = myMap.get(myListKey); 
if (tmp == null) { 
    tmp = new LinkedList<Object>(); 
    myMap.put(myListKey, tmp); 
} 
tmp.add(myObjectToAdd); 

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

+1

нет, это проверено! – vefthym

+1

@almasshaikh - он не будет вызывать исключение нулевого указателя, потому что если 'tmp' является' null', перед его использованием ему присваивается значение, отличное от 'null'. –

1

Вы можете использовать решение Теда Хопп, которая работает прекрасно, или использовать гуавы-х ListMultimap, как это:

ListMultimap<ListKeyType,Object> myMap = ArrayListMultimap.create(); 

...add function 

myMap.put(myListKey, myObjectToAdd); 

я выбрал бы ответ Теда, просто добавив этот ответ на другой вариант.

Кроме того, компиляторы «на свой период» любят Гуаву!

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