当键是一个只知道第一个元素的元组时,如何获取scala Map值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当键是一个只知道第一个元素的元组时,如何获取scala Map值?相关的知识,希望对你有一定的参考价值。
假设我有一个scala immutable Map[(String, Boolean), Set[String]]
,例如:
val myMap = Map(("a",true) -> Set("b","c"))
现在假设我只知道关键元组"a"
的第一个元素。可以(如果是的话)我得到这个键的地图值如果:
1)我知道密钥可以是("a", true)
或("a", false)
(不能有两个键与第一个元素具有相同的字符串)
2)我不知道,在这种情况下,我希望对可能的两个值进行某种连接,例如v1.union(v2)
或v1 ++ v2
等。
有没有我可以使用的scala“魔法”,比如myMap.get(("a", Any))
?
myMap.collect {
case (("a",b), s) => s
}.toSet.flatten
更新(查看评论):
如果myMap
相当大,你可以尝试:
Set(myMap.get("a", true), myMap.get("a", false)).flatten.flatten
通常,哈希映射不能像这样工作,至少是有效的 - 您仍然可以线性扫描地图并选择符合条件的第一个键。在您的特定情况下,您可以简单地尝试查找记录两次 - 首先使用(key, true)
,然后如果没有找到任何内容(key, false)
如果你有很多这样的查询,用Map[String, Map[Boolean, Set[String]]
替换地图可能是个好主意。应该很容易看出它们是等价的:当你有例如("a", false) -> Set()
和("a", true) -> Set("a")
在你的原始地图中,你将在新的地方有"a" -> Map(false -> Set(), true -> Set("a"))
。
但是,它可能会降低内存效率,尤其是对于这些关键类型。您可以通过用Map[Boolean, Set[String]]
替换(Option[Set[String]], Option[Set[String]])
来改善这一点,其中第一个字段对应于false
,第二个字段对应于true
。
在这种情况下
1)我知道密钥可以是(“a”,true)或(“a”,false)(不能有两个键与第一个元素具有相同的String)
只需使用Map[String, (Boolean, Set[String])]
。
以上是关于当键是一个只知道第一个元素的元组时,如何获取scala Map值?的主要内容,如果未能解决你的问题,请参考以下文章