Scala映射模式匹配

Scala映射模式匹配,scala,map,pattern-matching,scala-collections,Scala,Map,Pattern Matching,Scala Collections,如何在Scala中的映射上进行模式匹配 (非工作)尝试包括: Map("a"->1, "b"->2, "c"->3) match { case Map(a,b,_*) => a } 哪个是错误的 value Map is not a case class, nor does it have an unapply/unapplySeq member case Map(a,b,_*) => a 这个错误足以说明问题,但是如何使用不适用

如何在Scala中的
映射上进行模式匹配

(非工作)尝试包括:

Map("a"->1, "b"->2, "c"->3) match {
  case Map(a,b,_*) => a
}
哪个是错误的

value Map is not a case class, nor does it have an unapply/unapplySeq member
              case Map(a,b,_*) => a
这个错误足以说明问题,但是如何使用
不适用的
模式匹配方法来丰富
Map

非常感谢

更新

在@Paul的评论之后,一个更整洁的用例可能是这样的

Map("a"->1, "b"->2, "c"->3) match {
  case Map("b"->2,_*) => "222"
}

也就是说,在这种情况下,如果map包含映射到值
2
的键
b
,最简单的方法是tramsform
map
List

Map("a"->1, "b"->2, "c"->3).to[List] match {
  case List(a,b,_*) => a
}

使用模式匹配的
undislyseq
方法丰富
Map
的方法包括:

object MapExtractor {
  def unapplySeq[A <% Ordered[A], B <% Ordered[B]]
      (s: Map[A,B]): Option[Seq[(A,B)]] = Some(s.toSeq.sorted) 
}
交付

x: (a,1)
xs: ArrayBuffer((b,2), (c,3))

谢了一顿,在改造中订购是一样的;否则有时可能会变成列表((“a”,1),(“b”,2),…)和列表((“b”,2),(“a”,1),…)其他时间?@酶列表是scala中有序的集合,因此它们将与您在地图中的顺序相匹配。@EndeNeu好的一点,这实际上是个问题,地图在键中是否有任何顺序,即map(“a”->1,“b”->2”,“c”->3)。键集(a,b,c)也可能没有unapply方法。如果您有一个
Map(“a”->1,b”->2)
并调用
toList
列表将具有与Map相同的元组顺序:
list((((“a”,1),(“b”,2))
,如果Map是
Map(“b”->1,“a”->2)
,toList方法返回:
list((“b”,1),(“a,2))
,您也可以在REPL中尝试。尽管@EndeNeu有评论,但我不认为地图通常是有序的。例如,如果地图包含一个键“a”和一个键“b”,您想匹配什么?我不清楚您希望地图模式匹配做什么。@Paul,谢谢您的评论,请注意更新。好的。现在它是的副本
x: (a,1)
xs: ArrayBuffer((b,2), (c,3))