2013-02-18 8 views
5

Ich habe folgende Listen:scala - mit Filter mit Pattern-Matching

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 

Ich mag würde alle "ids"> 45 filtern. Ich habe versucht, so etwas wie dieser Artikel filter using pattern matching):

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

aber ohne Erfolg. schätzen Ihre Hilfe

+0

scala gibt> someList.filter {case (myPair) => myPair.ids> = 45} res1: Liste [myPair] = List (myPair (89,90) , myPair (45,75)) (aber Antwort von Tomasz Nurkeiviecz ist besser, natürlich) – twillouer

+0

@ twillouer: Ich freue mich über Ihre Bearbeitung, aber bitte fügen Sie eine separate Antwort, so dass Sie eine volle Anerkennung dafür erhalten können. –

+0

Sie können Ihren 'map'-Aufruf vereinfachen:' someTable.map (myPair.tupled) .toList' – EECOLOR

Antwort

17

Sie brauchen keine Muster an alle passenden, geben Sie bei der Kompilierung bekannt ist:

someList.filter(_.ids >= 45) 

oder etwas ausführlicher/lesbar:

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

Danke, einfach und effizient – igx

4

Sie meinen mögen:

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

umbenannt myPair-MyPair werden Bezeichner, die mit Kleinbuchstaben beginnen, als Variablen betrachtet, ähnlich wie ids und vals in obigem. - Das stimmt natürlich nicht, schauen Sie sich @ RandallSchulz 'Kommentar an.

geht weiter (1):

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

Noch mehr (2):

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

Way mehr (3):

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

Natürlich nur (1) ist über Mustervergleich. (2) und (3) wandelt die Argumente von MyPair.apply(Int,Int) in Tuple [Int, Int] um.

+2

Namen, die mit Kleinbuchstaben beginnen, werden nur dann als freie Mustervariablen betrachtet, wenn ihnen keine folgt öffne Klammern. Nichtsdestotrotz sollte jede Klasse mit einem alphanumerischen Namen mit einem Großbuchstaben beginnen. Auf der anderen Seite, wenn Sie, sagen wir, eine 'RegEx'-Instanz haben und mit ihr (über' RegEx's Extraktor) übereinstimmen wollen, gibt es keinen Grund, sie mit einem Großbuchstaben zu beginnen. –

+0

Ja, ich habe fast im Ref gesehen ... Vielen Dank für die Erklärung, @RandallSchulz – pedrofurla

+0

Danke !!! aber warum sie zu einem Tupel machen? Gibt es einen Vorteil? – igx

2

Hier ist eine weitere Variante mit Muster

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

collect kombiniert eine Filteroperation und eine Karte Betrieb entsprechen.

+0

Danke, das ist interessant, denn hier braucht man eigentlich nicht die Verwendung von MyPair und benutzt es einfach so: 'someTable collect {case (d , v) wenn i> 45 => MyPair (i, v)} – igx

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) 

Welche

someList: List[myPair] = List(myPair(89,90))