如何在Kotlin中使用键的开头从Map中获取值

kb5ga3dv  于 2023-08-06  发布在  Kotlin
关注(0)|答案(1)|浏览(138)

尝试仅使用键的开头从map获取值。如果一个<strings,strings>的haveMap,并且我知道键的开头是“aaa”、“bbb”或“ccc”,有没有方法可以检索该字符串值?
示例Map
“aaa_unknownText”->“Hello world”
“bbb_unknown_Text”->“你好火星”
“ccc_unknown_TEXT”->“你好木星”
想要获取“bbb”的字符串值,即“hello mars”
我的想法是把钥匙放在列表中。然后对每个字符串进行列表检查,直到找到匹配项,并将该Key保存在瓦尔foundKey中。然后使用map.get(foundKey)获取String Value。新到Kotlin想知道是否有不同的方法,也许使用map.filter选项,谢谢!

  • 谢谢你的回复!获取了一些代码,目前
map.filterkeys { it.startsWith("bbb") }.toList().map{ it.second }[0]

字符串
键“aaa”、“bbb”和“ccc”在Map中只会出现一次,并且保证会出现。需要将结果值作为字符串,因此将其转换为列表并获得index [0]

vktxenjb

vktxenjb1#

如果你确定最多只有 * 一个 * 项,其键以给定的字符串开头,你可以使用firstNotNullOfOrNull

map.firstNotNullOfOrNull { e -> e.value.takeIf { e.key.startsWith("aaa") } }

字符串
如果没有匹配的键,则返回null。
firstNotNullOfOrNull返回该Map中闭包返回非空值的第一个值,如果闭包为所有条目返回空值,则返回空值。我在这里传递的闭包使用takeIf。如果条目的键以“aaa”开头,则返回条目的值,否则返回null。
如果你有一个以上的匹配键,使用filterKeys获取一个删除所有不匹配键的Map,然后获取它们的values

map.filterKeys { it.startsWith("aaa") }.values


这将为您提供一个Collection<String>,其中包含所有与匹配键对应的值。
这两种方法都是O(n)时间。Map不应该这样使用。如果没有超过一个匹配的键,并且您需要多次访问Map,我建议您只使用键的开始部分创建一个新的Map。

// assuming you want to match the part before the first underscore
val newMap = map.mapKeys { it.key.split("_").first() }


然后你可以查询newMap

相关问题