2010-09-06 38 views
14

Giả sử tôi có hai danh sách:Tìm các yếu tố trong một danh sách không có trong danh sách thứ hai (trong scala)

val a = List('a', 'b', 'c') 
val b = List('a', 'b', 'c', 'd') 

Tôi muốn để có được những yếu tố mà không có trong danh sách đầu tiên (trong trường hợp này đó là ' d '). Tôi biết tôi có thể làm điều này với một vòng lặp, nhưng là có bất kỳ cách chức năng ưa thích để làm điều này một cách nhanh chóng trong một dòng?

Tôi đã xem API danh sách Scala, nhưng chỉ có thể tìm thấy công đoàn và giao lộ (sẽ cung cấp cho tôi Danh sách ('a', 'b', 'c', 'd') và Danh sách ('a ',' b ',' c ') tương ứng)

Trả lời

12

Tôi nghĩ bạn có thể sử dụng b -- a. Dưới đây là tài liệu từ scala:

def -- [B >: A] (that: List[B]) : List[B] 
Computes the difference between this list and the given list that. 
that 
the list of elements to remove from this list. 
returns this list without the elements of the given list that. 
deprecated: use list1 filterNot (list2 contains) instead 

Xin lỗi vì phương pháp không dùng nữa, đây là hiện tại tốt nhất: list1 filterNot (list2 contains)

def filterNot (p: (A) ⇒ Boolean) :

Danh sách [A] Chọn tất cả các yếu tố của danh sách này không thỏa mãn vị từ. p biến vị ngữ được sử dụng để kiểm tra các phần tử. trả về một danh sách mới bao gồm tất cả các thành phần của danh sách này không thỏa mãn vị từ đã cho p. Thứ tự của các phần tử được giữ nguyên. lớp định nghĩa: TraversableLike

+0

Cảm ơn bạn! Ngoại trừ trong 2,8 dường như họ nói rằng nó không được chấp nhận và sẽ được loại bỏ: OutputTree.scala: 136: phương thức - trong danh sách lớp không được chấp nhận: sử dụng 'list1 filterNot (list2 contains)' thay vì –

+1

ah bạn thậm chí sao chép và dán ghi chú không dùng nữa! Lỗi của tôi! =) –

+0

Đừng lo lắng, tôi không thực sự thấy dòng không dùng nữa, chỉ cần sao chép toàn bộ :) – vodkhang

18

Bạn có thể sử dụng diff cho việc này:

scala> b diff a 
res1: List[Char] = List(d) 

Bạn có thể muốn làm việc với Set nếu bạn đang làm diff.

0

Tất nhiên, điều này có thể được thực hiện bằng nhiều cách. Đối với các cấu trúc phẳng như danh sách các số và chuỗi diff là thanh lịch nhất. Các cách khác là,

val ans1 = for { x <- b if !a.contains(x) } yield x 

val ans2 = for { x <- b if !a.exists(_ == x) } yield x 

val ans3 = b filterNot (x => b.contains(x)) 

val ans4 = b diff a 
Các vấn đề liên quan