我正在寻找一种重命名 Hashmap 键的方法,但我不知道这在 Java 中是否可行。
尝试删除该元素并使用新名称再次放置。假设你的地图中的键是
String
,可以通过这种方式实现:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
hashMap.put("New_Key", hashMap.remove("Old_Key"));
这将执行您想要的操作,但是您会注意到密钥的位置已更改。
将需要重命名的键的值赋给新键。并取下旧钥匙。
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
添加后,您无法重命名/修改哈希图
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
您不需要重命名哈希映射键,您必须使用新键插入一个新条目并删除旧条目。
我认为 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!!!");
在我的例子中,有一个包含非真实键 -> 真实键的地图,因此我必须将非实数替换为地图中的实数(这个想法与其他人一样)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);
请看以下几点:
不可以,一旦添加
key
,您将无法重命名HashMap
。
首先您必须删除或删除该
key
,然后您可以使用 key
插入新的 value
。
因为在
HashMap
内部实现中,HashMap
键修饰符是 final
。
使用更现代的 Java,您可以简单地做到这一点
var new_map = old_map.entrySet().stream().collect(Collectors.toMap(e -> {
// Rename key here
return e.getKey() + "_postfix";
}, v -> v));