如何从 Kotlin 中的 Hashmap 获取值的关键?

Posted

技术标签:

【中文标题】如何从 Kotlin 中的 Hashmap 获取值的关键?【英文标题】:How to get key for value from Hashmap in Kotlin? 【发布时间】:2019-10-24 15:34:34 【问题描述】:

我在 Kotlin 中有 HashMap

val map = HashMap<String, String>()

我想知道如何在不遍历完整的 HashMap 的情况下从该 HashMap 获取特定值的密钥?

【问题讨论】:

你试过filterValues 吗? 不行,请分享代码。 kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/… 没办法,值没有被索引。尝试使用 BiMap,它是来自 Guava 的双向 Map 实现。 您是否还需要获取特定键的值? (如果没有,你的 HashMap 是倒退的)。 【参考方案1】:

使用filterValues

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

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

【讨论】:

> 没有遍历完整的HashMap 这个答案的问题是您将收到键值但在大括号内,例如[A] 或 [9] 而不是 A 或 9。仅供参考 是的,我提到它将是一个集合 所以查找速度与哈希映射的大小无关,就像键值查找一样? 如果你想摆脱大括号[a],你可以做.first()或.last()。你会得到a【参考方案2】:

在 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.

【讨论】:

【参考方案3】:

在最坏的情况下(如果地图中不存在匹配值),您将不得不遍历整个地图。但是,此代码将在找到匹配项后立即停止迭代:

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"

【讨论】:

【参考方案4】:

如果您经常按值查找键,可能的解决方案是反转地图,这样您就可以按任何值获取任何键。

例如:

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

val resultKey = reversed[value]

希望对你有帮助!

【讨论】:

以上是关于如何从 Kotlin 中的 Hashmap 获取值的关键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?

如何使用Kotlin从Firestore中的数组字段中获取数据?

Kotlin Android Firebase 数据库 Hashmap 转换为类

如何从 JSON 数组中的 JSON 对象中的单个值获取数据?

如何使用 HashMap 从 Android 的 Firebase 中的子节点获取数据?

如何从 Kotlin 中的服务器正确获取 XML