首页 > 解决方案 > 更新 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?)
                                        }
                                    }
                                }
                            }

但它没有提供所需的输出。

如何使它在没有并发异常的情况下工作。

标签: javaandroidkotlinconcurrencyhashmap

解决方案


另一种方法是使用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保留插入顺序的 )。

更一般的方法是:

  1. 递减所有键
  2. 过滤掉所有非正键

但是,这将需要 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)
}

推荐阅读