假设我有一个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“magic”,例如myMap.get(("a", Any))
吗?
答案 0 :(得分:9)
通常,哈希映射不能像这样工作,至少是有效的 - 您仍然可以线性扫描地图并选择符合条件的第一个键。在您的特定情况下,您只需尝试两次查找记录 - 首先使用(key, true)
,然后如果找不到任何内容(key, false)
答案 1 :(得分:6)
myMap.collect {
case (("a",b), s) => s
}.toSet.flatten
更新(查看评论):
如果myMap
相当大,您可以尝试:
Set(myMap.get("a", true), myMap.get("a", false)).flatten.flatten
答案 2 :(得分:3)
如果你有很多类似的问题,那么用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])]
。