2013-02-18 29 views
5

tôi có các danh mục sau:scala - sử dụng bộ lọc với mô hình phù hợp với

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 

Tôi muốn lọc tất cả "id"> 45. Tôi đã thử một cái gì đó giống như bài viết này filter using pattern matching):

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

nhưng không thành công. đánh giá cao sự giúp đỡ của bạn

+0

scala> someList.filter {case (myPair) => myPair.ids> = 45} res1: Danh sách [myPair] = Danh sách (myPair (89,90) , myPair (45,75)) (nhưng câu trả lời từ Tomasz Nurkeiviecz là tốt hơn, tắt khóa học) – twillouer

+0

@twillouer: Tôi đánh giá cao sự chỉnh sửa của bạn nhưng vui lòng thêm câu trả lời riêng để bạn có thể nhận được tín dụng đầy đủ. –

+0

Bạn có thể đơn giản hóa cuộc gọi 'map' của bạn:' someTable.map (myPair.tupled) .toList' – EECOLOR

Trả lời

17

Bạn không cần phải mô hình phù hợp ở tất cả, loại được biết đến tại thời gian biên dịch:

someList.filter(_.ids >= 45) 

hoặc hơi dài dòng hơn/dễ đọc:

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

Cảm ơn, đơn giản và hiệu quả – igx

4

Bạn có nghĩa là thích:

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

Đã đổi tên myPair thành MyPair, số nhận dạng bắt đầu bằng chữ thường được coi là biến, giống như số idsvals ở trên. - Thực ra điều này không đúng, hãy nhìn nhận xét của @ RandallSchulz.

Đi xa hơn (1):

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

Thậm chí nhiều hơn (2):

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

Way hơn (3):

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

Tất nhiên, chỉ có (1) là về khớp mẫu. (2) và (3) đang chuyển các đối số của MyPair.apply(Int,Int) thành Tuple [Int, Int].

+2

Tên bắt đầu bằng chữ thường chỉ được coi là biến mẫu miễn phí khi chúng không được theo sau bởi mở dấu ngoặc đơn. Tuy nhiên, bất kỳ lớp nào có tên chữ và số phải bắt đầu bằng chữ cái viết hoa. Mặt khác, nếu bạn có, ví dụ, một cá thể 'RegEx' và muốn khớp với nó (thông qua trình trích xuất' RegEx'), không có lý do gì để đặt tên nó bắt đầu bằng một chữ cái viết hoa. –

+0

Vâng, tôi gần như đã tìm kiếm nó trong ref ... Cảm ơn bạn đã giải thích, @RandallSchulz – pedrofurla

+0

Cảm ơn! nhưng tại sao biến chúng thành một tuple? có lợi ích gì không? – igx

2

Dưới đây là một biến thể sử dụng mô hình kết hợp

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

thu thập kết hợp một bộ lọc hoạt động và hoạt động bản đồ.

+0

Cảm ơn, đó là thú vị, bởi vì ở đây thực sự không cần sử dụng MyPair và sử dụng nó đơn giản như thế này: 'someTable collect {case (i , v) nếu 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) 

Mà cho

someList: List[myPair] = List(myPair(89,90)) 
Các vấn đề liên quan