在Kotlin中如何从Hashmap获取值对应的键?

29

我在 Kotlin 中有一个 HashMap

val map = HashMap<String, String>()

我想知道如何从这个HashMap中获取特定值的键,而无需遍历整个HashMap

我想知道如何从这个HashMap中获取特定值的键,而无需遍历整个HashMap


你尝试过使用 filterValues {} 吗? - P.Juni
请不要分享代码。 - Asad Ali Choudhry
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter-values.html - P.Juni
4
不行,值不能被索引。尝试使用BiMap,这是来自Guava的双向映射实现的Map。 - Miha_x64
2
你是否也需要获取特定键的值?(如果不需要,那么你的HashMap是反向的)。 - charles-allen
@AsadAliChoudhry 我建议你先学习HashMap的内部机制,然后你会意识到哈希映射不是你要找的东西。 - Sarthak Mittal
4个回答

49

使用 filterValues {}

val map = HashMap<String, String>()
val keys = map.filterValues { it == "your_value" }.keys

keys 将是与给定值匹配的所有键的集合


5
不需要完全迭代 HashMap - Miha_x64
这个答案的问题在于你会收到带有括号的键值,例如[A]或[9],而不是A或9。只是提供信息。 - portfoliobuilder
是的,我提到它将是一个集合。 - P.Juni
因此,查找速度与哈希表的大小无关,就像键到值的查找一样? - the_prole
2
如果你想去掉方括号 [a] ,你可以使用 .first().last() 方法。这样你就可以得到 a - sayil aguirre

8

在最坏情况下(如果映射中不存在匹配的值),您将不得不遍历整个映射。但是,只要找到匹配项,此代码就会停止迭代:

val map = mapOf("a" to 1, "b" to 2, "c" to 3)

val matchingKey = map.entries.find { it.value == 3 }?.key

println(matchingKey) // prints "c"

7

如果你经常需要根据值来查找键,一种可能的解决方案是将地图反转,这样你就可以通过任何值获取任何键。

例如:

val reversed = map.entries.associate{(k,v)-> v to k}

val resultKey = reversed[value]

希望对您有所帮助!

3
在 Kotlin 中的 HashMap,你可以使用以下方法:
val hashMap = HashMap<String, String>() // Dummy HashMap.

val keyFirstElement = hashMap.keys.first() // Get key.
val valueOfElement = hashMap.getValue(keyFirstElement) // Get Value.
    
val keyByIndex = hashMap.keys.elementAt(0) // Get key by index.
val valueOfElement = hashMap.getValue(keyByIndex) // Get value.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接