106

我正在寻找一种重命名 Hashmap 键的方法,但我不知道在 Java 中是否可行。

4

9 回答 9

156

尝试删除元素并使用新名称重新放置。假设您的地图中的键是String,则可以通过以下方式实现:

Object obj = map.remove("oldKey");
map.put("newKey", obj);
于 2012-05-26T14:05:18.527 回答
28
hashMap.put("New_Key", hashMap.remove("Old_Key"));

这会做你想做的,但是你会注意到钥匙的位置已经改变了。

于 2016-10-30T14:27:45.103 回答
21

将需要重命名的键的值分配给新键。并取下旧钥匙。

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
于 2013-12-18T06:07:50.233 回答
12

添加后,您无法重命名/修改哈希图key

唯一的方法是删除/删除key和插入新的keyvalue对。

原因:在hashmap内部实现中,Hashmapkey修饰符标记为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

于 2015-06-26T09:19:09.597 回答
4

您不重命名哈希映射键,您必须使用新键插入新条目并删除旧条目。

于 2012-05-26T14:05:18.433 回答
3

我认为 hasmap 键的本质是用于索引访问目的,仅此而已,但这里有一个 hack:围绕键的值创建一个键包装器类,以便键包装器对象成为索引访问的 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!!!");
于 2019-07-28T18:15:12.580 回答
1

请看以下几点:

  1. key不,HashMap一旦添加,您不能重命名。

  2. 首先,您必须删除或删除它key,然后您可以使用 new keywith插入value

  3. 因为在HashMap内部实现中,HashMap键修饰符是final.

于 2020-05-12T16:19:24.847 回答
1

在我的情况下,地图包含非真实键-> 真实键,所以我不得不用我的地图中的实数替换非实数(这个想法就像其他人一样)

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
于 2020-05-12T16:00:00.540 回答
0

您可以,如果您将使用Bimap而不是 Java 本机 HashMap 。
这不是传统的 Map 实现,您需要确保它适合您的需求。

双映射(或“双向映射”)是一种映射,它保留其值的唯一性以及其键的唯一性。此约束使 bimap 能够支持“反向视图”,这是另一个 bimap,包含与此 bimap 相同的条目,但具有相反的键和值。

使用 bimap,您可以反转视图并替换键。
查看 Apache Commons BidiMap和 Guava BiMap

于 2019-06-06T13:55:07.840 回答