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>
作为参数的函数来重载扩展。
另一答案
Map
有keys
集合,因为每个集合都实现了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包含使用数组的键的主要内容,如果未能解决你的问题,请参考以下文章