Java HashMap - Оптимизированный способ добавления нового значения в вектор, который является значением в HashMap - PullRequest
0 голосов
/ 15 марта 2020

Подобный способ добавления нового элемента в вектор, как в C ++: -

myHashMap[myKey].push_back(newElement); //push newElement to the value vector directly

Единственный способ, который я могу придумать в Java, - это получить вектор из hashmap. Добавьте новую строку к вектору, а затем снова установите ключ с новым вектором.

myValue = myHashMap.get(myKey);
/**Check if the key exists

**/
//If exists
myValue.add(newElement);
myHashmap.put(myKey, myValue);

Является ли второй подход более быстрым, чем предыдущий, и если нет, то есть ли другой подход? Спасибо

Ответы [ 3 ]

3 голосов
/ 15 марта 2020

Вам не нужно возвращать вектор обратно на карту, поскольку вы уже изменяете вектор при добавлении к нему.

myHashMap[myKey].push_back(newElement); 

достигается с помощью

myHashMap.get(myKey)
     .add(newElement);

( при условии, что myHashMap.get(myKey) не возвращает null ).


Вы можете использовать computeIfAbsent в интерфейсе карты, чтобы создать векторный объект для ключа, обработанного в первый раз. Это более элегантно и не требует , если блок.

myHashMap.computeIfAbsent(key, k -> new Vector<>())
            .add(newElement);

Функция (k -> new Vector<>()) выполняется только в том случае, если myHashMap не имеет сопоставления для ключа key. Приятно то, что он возвращает значение вектора key, поэтому мы можем связать с ним вызов add.

1 голос
/ 15 марта 2020

Во-первых, если вы заботитесь о производительности в Java, используйте ArrayList вместо Vector. Как говорится в javado c:

Начиная с платформы Java 2 v1.2, [Vector] был модернизирован для реализации интерфейса List, сделав его членом Java Collections Framework. В отличие от новых реализаций коллекции, Vector синхронизируется. Если поточно-ориентированная реализация не требуется, рекомендуется использовать ArrayList вместо Vector.

Итак, предположим, что мы используем Java 8 (и ArrayList) , есть два перевода для кода C ++.

Версия # 1. Работает для Java 5 +

HashMap<String, ArrayList<String>> myMap = new HashMap<>();
...
ArrayList<String> list = myMap.get(myKey);
if (list == null) {
    list = new ArrayList<>();
    myMap.put(myKey, list);
} 
list.add(newElement);

Версия # 2. Работает на Java 8 +

HashMap<String, ArrayList<String>> myMap = new HashMap<>();
...
myMap.computeIfAbsent(key, k -> ArrayList<>()).add(newElement);

Что будет быстрее? Вы должны проверить это, чтобы быть уверенным, но я думаю, что вторая версия должна быть немного быстрее, потому что она избегает второго поиска по хэш-карте в вызове put.

И 1 строка кода аккуратнее, чем 6 строк. (YMMV для удобочитаемости. Это зависит от человека, читающего код, и от того, насколько они знакомы с Java 8+ языковыми функциями и API.)

0 голосов
/ 15 марта 2020

Вы можете сделать то же самое в java. myHashMap.get(key).add(newValue) Потому что в хэш-карте ссылка на список (или вы можете сказать, что это вектор) хранится как значение. Таким образом, изменение содержимого списка не повлияет на ссылку. Вы можете себе представить, что эта ссылка любит 64-битный адрес вектора в c ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...