2013-04-29 37 views
21

Tôi có hai danh sách:Scala sự khác biệt của hai danh sách

val list1 = List("word1","word2","word2","word3","word1") 
val list2 = List("word1","word4") 

Tôi muốn loại bỏ tất cả các lần xuất hiện của list2 yếu tố từ list1, tức là tôi muốn

List("word2","word2","word3") <= list1 *minus* list2 

tôi đã làm list1 diff list2 mà mang lại cho tôi List("word2","word2","word3","word1") chỉ loại bỏ lần xuất hiện đầu tiên của "word1".

Tôi không thể chuyển đổi thành tập hợp vì tôi cần kiến ​​thức về các bản sao (xem "word2" ở trên). Phải làm gì?

Trả lời

43

Bạn có thể

val unwanted = list2.toSet 
list1.filterNot(unwanted) 

để loại bỏ tất cả các mục trong list2. (Bạn không cần kiến ​​thức về các bản sao ở list2.)

+0

Awesome! Cảm ơn –

+0

Tại sao 'xấu'? Bộ không phải là xấu cho mỗi se. –

+2

Tôi nghĩ rằng anh ta chỉ có nghĩa là "không mong muốn" - các mục mà bạn không muốn trong danh sách kết quả. – AmigoNico

6

Bạn có thể thử này:

val list1 = List("word1","word2","word2","word3","word1") 
val list2 = List("word1","word4") 

println(list1.filterNot(list2.contains(_))) 
+2

Hoạt động chứa trên danh sách 2 không hiệu quả - nó sẽ thực hiện quét tuyến tính cho mọi phần tử của danh sách1, do đó có các lần lặp n x m trong vòng lặp bên trong. Đặt thử nghiệm ngăn chặn tốt hơn danh sách cho bất kỳ tập hợp không tầm thường nào vì trước tiên sử dụng so sánh hashcode để loại bỏ hầu hết các trường hợp và chỉ kiểm tra chuỗi bình đẳng trong số ít trường hợp còn lại, nếu có. (Làm thế nào tốt điều này phụ thuộc vào thuật toán băm đang sử dụng). –

+0

Cảm ơn @ Rick-777. Điều đó có ý nghĩa. – cmbaxter

+0

Đặt hiệu quả hơn, nhưng không bảo vệ trật tự. Nếu có bất kỳ bộ nào giữ gìn trật tự tôi muốn sử dụng nó cho trường hợp của tôi – ayvango

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