当键是一个只知道第一个元素的元组时,如何获取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值?的主要内容,如果未能解决你的问题,请参考以下文章

关于python的元组操作

创建和删除DOM元素

如何比较和搜索列表中的元素与列表 SML 中的元组

创建和删除元素

python学习之第五篇:Python中的元组及其所具有的方法

定义只包含一个元素的元组