Kotlin HashMap包含使用数组的键

时间:2017-12-16 19:09:35

标签: hashmap kotlin

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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>

您可能还希望使用另一个以nav-pills作为参数的函数来重载扩展名。

答案 1 :(得分:1)

Mapkeys个集合,每个集合实现containsAll方法,因此您可以使用它来检查keys集合是否包含所有键:< / p>

map.keys.containsAll(keysArray.asList())

答案 2 :(得分:0)

您可以使用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
  }
}