2013-02-18 63 views
5

我有以下列表:斯卡拉 - 使用过滤器模式匹配

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”> 45。 我想是这样的文章filter using pattern matching):

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

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

+0

阶> someList.filter {情况下(myPair)=> myPair.ids> = 45} RES1:列表[myPair] =列表(myPair(89,90) ,myPair(45,75)) (但Tomasz Nurkeiviecz的答案比较好,偏离课程) – twillouer 2013-02-18 17:18:51

+0

@twillouer:感谢您的修改,但请添加一个单独的答案,以便您可以获得完整的功劳。 – 2013-02-18 17:22:01

+0

您可以简化您的'map'调用:'someTable.map(myPair.tupled).toList' – EECOLOR 2013-02-18 17:42:15

回答

17

你并不需要在模式匹配所有,类型是在编译时已知:

someList.filter(_.ids >= 45) 

或稍微详细/可读性:

someList.filter(pair => pair.ids >= 45) 
+0

感谢您,简单高效 – igx 2013-02-19 03:46:38

4

你的意思是这样的:

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]。

+2

以小写字母开头的名称只有在没有跟随左括号。尽管如此,任何带有字母数字名称的类都应以大写字母开头。另一方面,如果你有一个'RegEx'实例并想与它匹配(通过'RegEx'的提取器),没有理由以大写字母开头来命名它。 – 2013-02-18 17:49:15

+0

是的,我差点在ref中寻找它...感谢您的解释,@RandallSchulz – pedrofurla 2013-02-18 18:08:56

+0

谢谢!但为什么把它们变成一个元组?有什么好处吗? – igx 2013-02-19 03:38:33

2

这里有一个多种变异使用模式匹配

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

收集结合了过滤操作和映射操作。

+0

谢谢,这很有趣,因为这里实际上并不需要使用MyPair并且使用它就像这样: 'someTable collect {case(i ,v)如果i> 45 => MyPair(i,v)}' – igx 2013-02-19 03:45:40

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))