是否可以重命名 Hashmap 键?

问题描述 投票:0回答:10

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

java hashmap
10个回答
173
投票

尝试删除该元素并使用新名称再次放置。假设你的地图中的键是

String
,可以通过这种方式实现:

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

30
投票
hashMap.put("New_Key", hashMap.remove("Old_Key"));

这将执行您想要的操作,但是您会注意到密钥的位置已更改。


21
投票

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

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

13
投票

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

key

唯一的方法是删除/删除

key
并插入新的
key
value
对。

原因:在hashmap内部实现中,Hashmap

key
修饰符标记为
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


4
投票

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


3
投票

我认为 hasmap 键的本质是用于索引访问目的,仅此而已,但这里有一个 hack:围绕键的值创建一个键包装类,以便键包装对象成为用于索引访问的哈希映射键,所以您可以根据您的特定需求访问和更改键包装对象的值:

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!!!");

1
投票

在我的例子中,有一个包含非真实键 -> 真实键的地图,因此我必须将非实数替换为地图中的实数(这个想法与其他人一样)

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);

1
投票

请看以下几点:

  1. 不可以,一旦添加

    key
    ,您将无法重命名
    HashMap

  2. 首先您必须删除或删除该

    key
    ,然后您可以使用
    key
    插入新的
    value

  3. 因为在

    HashMap
    内部实现中,
    HashMap
    键修饰符是
    final


0
投票

您可以,如果您使用 Bimap 代替 Java 原生 HashMap。
这不是传统的 Map 实现,您需要确保它适合您的需求。

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

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


0
投票

使用更现代的 Java,您可以简单地做到这一点

var new_map = old_map.entrySet().stream().collect(Collectors.toMap(e -> {
    // Rename key here
    return e.getKey() + "_postfix";
}, v -> v));
© www.soinside.com 2019 - 2024. All rights reserved.