我正在寻找一种重命名 Hashmap 键的方法,但我不知道在 Java 中是否可行。
问问题
106554 次
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
和插入新的key
和value
对。
原因:在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
请看以下几点:
key
不,HashMap
一旦添加,您不能重命名。首先,您必须删除或删除它
key
,然后您可以使用 newkey
with插入value
。因为在
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 回答