java - 更新 HashMap 的现有键
问题描述
我有长度为 3 的 HashMap < Integer,String>:
1=>"Value1"
2=>"Value2"
3=>"Value3"
现在我想将所有键减1(如果键> 1):输出:
1=>"Value2"
2=>"Value3"
我正在尝试什么
for (e in hashMap.entries) {
val entry = e as Map.Entry<*, *>
var keyPos = (entry.key as Int)
if (keyPos != -1) {
if (keyPos > 1) {
keyPos = keyPos - 1
if (keyPos != -1) {
hashMap.put(keyPos, entry.value as String?)
}
}
}
}
但它没有提供所需的输出。
如何使它在没有并发异常的情况下工作。
解决方案
另一种方法是使用mapKeys
扩展功能,它允许您重新定义地图条目的键:
fun main() {
val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")
val updatedMap = originalMap
.mapKeys {
if (it.key > 1) {
it.key - 1
} else {
it.key
}
}
println(updatedMap) // prints: {1=value2, 2=value3}
}
请注意,这不会就地更新地图,但会创建一个新地图。另请注意:
如果任何两个条目映射到相等的键,则后一个的值将覆盖与前一个关联的值。
这意味着如果两个键发生冲突,通常您无法知道哪个会“获胜”(除非您使用的是LinkedHashMap
保留插入顺序的 )。
更一般的方法是:
- 递减所有键
- 过滤掉所有非正键
但是,这将需要 2 次完整的迭代(除非您使用Sequences
,这是延迟评估的):
fun main() {
val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")
val updatedMap = originalMap
.mapKeys {
it.key - 1
}.filter {
it.key > 0
}
println(updatedMap)
}
推荐阅读
- c++ - 如果文件未正确完成,如何使用 libav 编写可播放的 .mov 文件
- c# - 在 nuget 包中包含代码分析器
- python - 是否可以使用矢量化 Pandas 代码解析包含数组的 csv 列?
- php - twilio 使用电话号码黑名单拒绝来电
- oracle - 我的重载函数游标 PLS-00103 中的错误
- angular - 在 android 和 iOS 上使用 Angular 在 nativescript 中处理注销
- vue.js - 用 Vue 配置 vue-echart-v3 支持 IE
- javascript - 使用 map 将数组索引传递给组件
- npm - npx create-react-app 不工作,文件已经存在
- react-native - 是否可以在 mailto url 中添加新行?