2012-05-26 4 views
61

Я ищу способ переименования ключа Hashmap, но я не знаю, возможно ли это на Java.Можно ли переименовать ключ Hashmap?

+8

Гош, надеюсь, нет. Удаление и повторное включение пары ключ/значение похоже на путь. Обратите внимание, что вы обычно просто обрабатываете ссылки на самой карте. –

+3

Пожалуйста, не изменяйте ключ записи хэша! Если вам повезет, вы измените его на что-то с тем же хэш-кодом, и вы просто сходите с ума, пытаясь выяснить, что произошло; если вам не повезло, вы получите запись, которая не может быть найдена (ну, пока не будет следующей перестройки всей таблицы). Remove/reinsert намного эффективнее, и должно быть довольно дешево (все-таки все ссылки). –

ответ

86

Попробуйте удалить элемент и поместить его снова с новым именем. Если предположить, что ключи в вашей карте будут String, это может быть достигнуто таким образом:

Object obj = map.remove("oldKey"); 
map.put("newKey", obj); 
+34

+1. Проще всего читать «map.put» («newKey», map.remove («oldKey»)); и содержит «oldKey» –

+6

Что касается удобочитаемости, я совершенно не согласен, я лично предпочитаю ясно видеть, что объект удаляется с карты, а затем добавляется. И поскольку OP, похоже, довольно нова для Java, я решил это сделать. Однако, ради производительности, ваша версия, конечно, предпочтительна (так как я не думаю, что компилятор будет оптимизировать мою версию на вашем пути). –

+2

Для javac 1.8.0_45 однострочная версия имеет два байткода короче, что меня удивило. Более раздражающе с дженериками вы не можете передать 'obj'' put', не отбрасывая его или объявляя его как другой тип, но, конечно, передача результата 'remove' напрямую работает. –

4

Вы не переименовываете ключ hashmap, вам нужно вставить новую запись с новым ключом и удалить старый.

11

Присвоить значение ключа, который нужно переименовать, с новым ключом. И удалите старый ключ.

hashMap.put("New_Key", hashMap.get("Old_Key")); 
hashMap.remove("Old_Key"); 
4

Вы не можете переименовать/изменить HashMap ключ раз добавил.

Только способ удалить/удалить ключ и вставить новую пару ключей и значений.

Причина: В Hashmap внутренней реализации модификатор ключ Hashmap отмечен как окончательный.

static class Entry<K ,V> implements Map.Entry<K ,V> 
{ 
final K key; 
V value; 
Entry<K ,V> next; 
final int hash; 
...//More code goes here 
} 

Справочно: HashMap

6
hashMap.put("New_Key", hashMap.remove("Old_Key")); 

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

+0

@Vins снова просмотрите документацию, пожалуйста: D, remove() вернется объект, проверьте этот https://www.tutorialspoint.com/java/util/hashmap_remove.htm –

+0

мой плохой, я удалил свой комментарий и проголосовал за него. Извини за это. – Vins

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