Я ищу способ переименовать ключ Hashmap, но не знаю, возможно ли это в Java.
Я ищу способ переименовать ключ Hashmap, но не знаю, возможно ли это в Java.
Ответы:
Попробуйте удалить элемент и поставить снова с новым именем. Предполагая, что ключи на вашей карте есть String
, это может быть достигнуто следующим образом:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
и при условии , что содержитoldKey
obj
чтобы put
без приведения его или объявить его в качестве другого типа, но, конечно , передавая результат из remove
непосредственно работает.
hashMap.put("New_Key", hashMap.remove("Old_Key"));
Это будет делать то, что вы хотите, но вы заметите, что расположение ключа изменилось.
Присвойте значение ключа, который нужно переименовать, новому ключу. И удалите старый ключ.
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
Вы не можете переименовать / изменить хэш-карту key
после добавления.
Единственный способ - удалить / удалить key
и вставить с новым key
и value
парным.
Причина : во внутренней реализации hashmapkey
модификаторHashmapпомечен какfinal
.
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
Вы не переименовываете ключ хэш-карты, вам нужно вставить новую запись с новым ключом и удалить старую.
Я бы сказал, что сущность ключей hasmap предназначена для целей доступа к индексу и не более того, но вот хитрость: создание класса-оболочки для ключа вокруг значения ключа, чтобы объект-оболочка для ключа стал ключом хэш-карты для доступа к индексу, поэтому вы может получить доступ и изменить значение объекта обертки ключа для ваших конкретных нужд:
public class KeyWrapper<T>{
private T key;
public KeyWrapper(T key){
this.key=key;
}
public void rename(T newkey){
this.key=newkey;
}
}
пример
HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper key=new KeyWrapper("cool-key");
hashmap.put(key,"value");
key.rename("cool-key-renamed");
Хотя у вас также может быть несуществующий ключ, чтобы получить значение существующего ключа из хэш-карты, но я боюсь, что в любом случае это может быть преступным:
public class KeyWrapper<T>{
private T key;
public KeyWrapper(T key){
this.key=key;
}
@Override
public boolean equals(Object o) {
return hashCode()==o.hashCode();
}
@Override
public int hashCode() {
int hash=((String)key).length();//however you want your hash to be computed such that two different objects may share the same at some point
return hash;
}
}
пример
HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper cool_key=new KeyWrapper("cool-key");
KeyWrapper fake_key=new KeyWrapper("fake-key");
hashmap.put(cool_key,"cool-value");
System.out.println("I don't believe it but its: "+hashmap.containsKey(fake_key)+" OMG!!!");
Вы можете, если вместо Java HashMap вы будете использовать Bimap .
Это не традиционная реализация карты, и вам нужно убедиться, что она соответствует вашим потребностям.
Двухсторонняя карта (или «двунаправленная карта») - это карта, которая сохраняет уникальность своих значений, а также уникальность своих ключей. Это ограничение позволяет бимапам поддерживать «инверсный вид», который представляет собой другой бимап, содержащий те же записи, что и этот бимап, но с инвертированными ключами и значениями.
Используя бимап, вы можете перевернуть представление и заменить ключ.
Оформить заказ как Apache Commons BidiMap, так и Guava BiMap .
В моем случае была карта, содержащая не настоящий ключ -> реальные ключи, поэтому мне пришлось заменить нереальные числа на реальные на моей карте (идея похожа на другие)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);