Kotlin HashMap包含使用数组的键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin HashMap包含使用数组的键相关的知识,希望对你有一定的参考价值。

有没有办法检查HashMap是否包含一组键,这些键在数组中给出了哪些键。当我尝试类似下面的代码时,它返回false。

map.containsKey(arrayOf("2018-01-16"))

如果我尝试以下代码它可以工作,但我需要检查密钥和我需要搜索的密钥数量是不固定的。

map.containsKey("2018-01-16")
答案

您可以从键本身开始,并使用标准库中的all函数:

val map = hashMapOf(...)
val keys = arrayOf("2018-01-16", "2018-01-17", "2018-01-18")
val containsAllKeys = keys.all { map.containsKey(it) }

如果你这么做并希望在Map类型上有这个功能,你可以随时添加它作为扩展:

fun <K, V> Map<K, V>.containsKeys(keys: Array<K>) = keys.all { this.containsKey(it) }

val containsAllKeys = map.containsKeys(arrayOf("2018-01-16", "2018-01-17"))

您可能还希望使用另一个以Iterable<K>作为参数的函数来重载扩展。

另一答案

Mapkeys集合,因为每个集合都实现了containsAll方法,所以你可以用它来检查keys集合是否包含所有键:

map.keys.containsAll(keysArray.asList())
另一答案

你可以使用ArrayList<T>作为关键,因为它的等于与Array<T>不同。我们来看看这个测试:

class ExampleUnitTest {
  @Test
  fun arrayAsKeyTest() {
    val hashMapOne = HashMap<Array<String>, Int>()
    val stringKeysOne1 = arrayOf("a", "b")
    hashMapOne.set(stringKeysOne1, 2)
    val stringKeysOne2 = arrayOf("a", "b")
    // NOT MATCH! As stringKeysOne1 == stringKeysOne2 is false
    assertFalse(hashMapOne.containsKey(stringKeysOne2)) // NOT MATCH

    val hashMapTwo = HashMap<ArrayList<String>, Int>()
    val stringKeysTwo1 = arrayListOf("a", "b")
    hashMapTwo.set(stringKeysTwo1, 2)
    val stringKeysTwo2 = arrayListOf("a", "b")
    // MATCH! As stringKeysTwo1 == stringKeysTwo2 is true (although stringKeysTwo1 === stringKeysTwo2 is false)
    assertTrue(hashMapTwo.containsKey(stringKeysTwo2)) // MATCH
  }
}

以上是关于Kotlin HashMap包含使用数组的键的主要内容,如果未能解决你的问题,请参考以下文章

如何使 HashMap 以数组为键工作?

LeetCode-Kotlin-Array-EASY-21至30题

Java HashMap实现原理 源码剖析

java集合系列之HashMap源码

数组可以用作 HashMap 键吗?

Kodein + Ktor = 冻结 kotlin.collections.HashMap 的突变尝试 - 为啥?