当键是一个只知道第一个元素的元组时,如何获取scala Map值?

时间:2015-07-31 12:20:31

标签: scala key tuples

假设我有一个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))吗?

3 个答案:

答案 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])]