当键是只有第一个元素已知的元组时,如何获取scala映射值?

当键是只有第一个元素已知的元组时,如何获取scala映射值?,scala,key,tuples,Scala,Key,Tuples,假设我有一个scala不可变映射[(字符串,布尔值),设置[String]],例如: val myMap = Map(("a",true) -> Set("b","c")) 现在假设我只知道键元组的第一个元素,“a”。如果满足以下条件,我可以(如果是,如何)获取此键的地图值: 1) 我知道键可以是(“a”,true)或(“a”,false)(不能有两个键的字符串与第一个元素相同) 2) 我不知道,在这种情况下,我希望对可能的两个值进行某种连接,例如v1.union(v2)或v1++v2,

假设我有一个scala不可变
映射[(字符串,布尔值),设置[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))

一般来说,哈希映射不是这样工作的,至少效率是这样的——您仍然可以线性扫描映射并选择符合条件的第一个键。在您的特定情况下,您只需尝试查找记录两次——首先使用
(key,true)
,然后如果未找到任何内容
(key,false)

更新了(查看评论):

如果
myMap
相当大,您可以尝试:

Set(myMap.get("a", true), myMap.get("a", false)).flatten.flatten

如果您有许多这样的查询,最好将映射替换为
map[String,map[Boolean,Set[String]]
。应该很容易看出它们是等价的:当您有例如
(“a”,false)->Set()
(“a”,true)->Set(“a”)
在原始映射中,您将有
“a”->映射(false->Set()),true->Set(“a”)
在新的中

但是,这可能会降低内存效率,尤其是对于这些键类型。您可以通过将
Map[Boolean,Set[String]]
替换为
(Option[Set[String]],Option[Set[String]])
,来改进这一点,其中第一个字段对应于
false
,第二个字段对应于
true

在这种情况下

1) 我知道键可以是(“a”,true)或(“a”,false)(不能有两个键与第一个元素具有相同的字符串)


只需使用
Map[String,(Boolean,Set[String])]
线性扫描地图?我希望地图很小!所以
List(myMap((“a”,true)),myMap((“a,false)))。展平
@Paul myMap.getOrElse(“a”->false,myMap(“a”->true)),我先做了,但这不对,因为这个“我不知道,在这种情况下,我希望对可能的两个值进行某种连接,例如v1.union(v2)或v1++v2,等等。”@Paul hm,坦率地说,我没有第二个要求:-(Hmm.应该是
List(myMap.get((“a”,true)),myMap.get((“a”,false))).flatte
。我看不懂文档,显然感谢@Alexey,这正是我最终要做的。没有真正的理由让映射必须是
map[(字符串,布尔值),Set[String]]
。我很抱歉。设计自定义数据结构太宽泛了。
Set(myMap.get("a", true), myMap.get("a", false)).flatten.flatten