Я шукаю спосіб перейменувати ключ 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 в цілях доступу до індексу і не більше, але ось хак: створення класу обгортки ключів навколо значення ключа, щоб об'єкт обгортки ключів став ключем hashmap для доступу до індексу, так що ви може отримувати доступ та змінювати значення об’єкта-обгортки ключів відповідно до ваших конкретних потреб:
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!!!");
Будь ласка, подивіться нижче пункти:
Ні, Ви не можете перейменувати key
з HashMap
коли - то додав.
Спочатку вам потрібно видалити або видалити це, key
а потім ви можете вставити з новим за key
допомогою value
.
Оскільки у HashMap
внутрішній реалізації HashMap
ключовим модифікатором є final
.
Ви можете, якщо замість рідної HashMap на Java ви будете використовувати Bimap .
Це не традиційна реалізація Map, і вам потрібно переконатися, що вона відповідає вашим потребам.
Бімапа (або "двонаправлена карта") - це карта, яка зберігає унікальність своїх значень, а також своїх ключів. Це обмеження дозволяє бімапам підтримувати "зворотний вигляд", який є іншим бімапом, що містить ті самі записи, що і цей бімап, але зі зворотними ключами та значеннями.
Використовуючи бімап, ви можете перевернути вигляд і замінити ключ. Оформіть
як Apache Commons BidiMap, так і Guava BiMap .
У моєму випадку була карта, що містить не справжній ключ -> реальні ключі, тому мені довелося замінити не реальні на реальні на моїй карті (ідея схожа на інші)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);