2011-07-14 31 views
10

Tôi đang thực hiện đối sánh mẫu trên danh sách. Có anyway tôi có thể truy cập vào phần tử đầu tiên và cuối cùng của danh sách để so sánh?Scala Lấy các yếu tố đầu tiên và cuối cùng của Danh sách bằng cách sử dụng Ghép mẫu

tôi muốn làm một cái gì đó giống như ..

case List(x, _*, y) if(x == y) => true 

hoặc

case x :: _* :: y =>

hoặc một cái gì đó tương tự ... nơi xy là những yếu tố đầu tiên và cuối cùng của danh sách ..

Làm cách nào tôi có thể làm điều đó .. bất kỳ ý tưởng nào?

+0

Từ scala 2.10 bạn chỉ có thể sử dụng cho cuối cùng def cuối [T] (xs: Seq [T]) = {trận đấu xs { trường hợp _: + x => x }}, xem https://issues.scala-lang.org/browse/SI-2575 –

Trả lời

24

Sử dụng các tiêu chuẩn :++: nhổ từ scala.collection gói


ORIGINAL ĐÁP

Xác định một đối tượng tùy chỉnh vắt.

object :+ { 
    def unapply[A](l: List[A]): Option[(List[A], A)] = { 
    if(l.isEmpty) 
     None 
    else 
     Some(l.init, l.last) 
    } 
} 

Có thể được sử dụng như:

val first :: (l :+ last) = List(3, 89, 11, 29, 90) 
println(first + " " + l + " " + last) // prints 3 List(89, 11, 29) 90 

(Đối với trường hợp của bạn: case x :: (_ :+ y) if(x == y) => true)

+0

Giải pháp gọn gàng. Quy tắc/thủ thuật nào trong Scala cho phép '(l: + last)' làm việc giống như '(: + (l, last))'? Không nhận ra điều này là có thể. – overthink

+2

Trả lời câu hỏi của riêng tôi - dường như được trả lời ở đây: http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working/1059161#1059161 với nhiều chi tiết hơn tại đây: http : //www.artima.com/pins1ed/working-with-lists.html#16.5 – overthink

16

Trong trường hợp bạn bỏ lỡ rõ ràng:

case list @ (head :: tail) if head == list.last => true 

Phần head::tail là có rất bạn không khớp trên danh sách trống.

5

đơn giản:

case head +: _ :+ last => 

ví dụ:

scala> val items = Seq("ham", "spam", "eggs") 
items: Seq[String] = List(ham, spam, eggs) 

scala> items match { 
    | case head +: _ :+ last => Some((head, last)) 
    | case _ => None 
    | } 
res0: Option[(String, String)] = Some((ham,eggs)) 
+0

Điều này thực sự không hoạt động trên danh sách với một phần tử. Để làm điều đó, bạn phải thêm một trường hợp bổ sung. –

Các vấn đề liên quan