7

我有以下列表:

case class myPair(ids:Int,vals:Int)

val someTable = List((20,30), (89,90), (40,65), (45,75), (35,45))

val someList:List[myPair] =
  someTable.map(elem => myPair(elem._1, elem._2)).toList

我想过滤所有 "ids" > 4​​5 。我使用模式匹配尝试了类似这篇文章的过滤器):

someList.filter{ case(myPair) => ids >= 45 }

但没有成功。感谢你的帮助

4

4 回答 4

18

您根本不需要模式匹配,类型在编译时是已知的:

someList.filter(_.ids >= 45)

或者稍微冗长/可读:

someList.filter(pair => pair.ids >= 45)
于 2013-02-18T17:10:26.133 回答
6

你的意思是:

someList.filter{ case MyPair(ids,vals) => ids >= 45 }

重命名myPairMyPair,以小写字母开头的标识符被认为是变量,很像上面的idsvals。——其实这不是真的,看看@RandallSchulz 的评论。

更进一步(1):

val someList = someTable.map(case (ids,vals) => MyPair(ids,vals)).toList

更多(2):

val someList = someTable.map(elem => MyPair.tupled(elem)).toList

方式更多(3):

val someList = someTable.map(MyPair.tupled).toList

当然,只有 (1) 是关于模式匹配的。(2) 和 (3) 将 的参数MyPair.apply(Int,Int)转换为 Tuple[Int,Int]。

于 2013-02-18T17:29:28.930 回答
6

这是使用模式匹配的另一种变体

someTable collect {case (i, v) if i > 45 => MyPair(i, v)}

collect 结合了过滤操作和映射操作。

于 2013-02-18T21:36:01.670 回答
0
case class myPair(ids:Int,vals:Int)

val someTable = List((20,30), (89,90), (40,65), (45,75), (35,45))

val someList:List[myPair] = for( elem <- someTable; if elem._1 > 45) yield myPair(elem._1, elem._2)

这使

someList: List[myPair] = List(myPair(89,90))
于 2013-02-18T22:36:09.050 回答