当键是只有第一个元素已知的元组时,如何获取scala映射值?
假设我有一个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,
映射[(字符串,布尔值),设置[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