2013-02-18 70 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))