2010-09-01 22 views
19

Giả sử:Có phương pháp API nào so sánh nội dung của Seq không phân biệt thứ tự không?

val l1 = List(1,2,3) 
val l2 = List(2,3,1) 

Tôi muốn có một phương pháp mà khẳng định rằng l1 bằng l2 (như trong cùng một nội dung nhưng thứ tự khác nhau). Có một phương pháp API trên List/Seq để làm điều này?

l1.sameElements(l2) 

không hoạt động khi xác minh đơn đặt hàng.

tôi đã đi lên với những điều sau:

l1.foldLeft(l1.size == l2.size)(_ && l2.contains(_)) 

Có điều gì hơn gọn gàng hơn so với ở trên để làm so sánh này?

+0

http://stackoverflow.com/questions/2944617/use-example-of-scala-observableset-trait –

+0

Câu hỏi được liên kết có liên quan như thế nào đến câu hỏi này? – ssanj

+0

Bộ có thể giải quyết được sự cố của anh ấy, nhưng nhận xét của anh ấy cho câu trả lời bên dưới nói rằng anh ấy cũng muốn các bản sao cũng được hỗ trợ, vì vậy Bộ giờ đây sẽ không hoạt động. –

Trả lời

27

Nếu những gì bạn muốn là "những danh sách này chứa các yếu tố giống nhau, không phụ thuộc vào thứ tự hoặc lặp đi lặp lại":

l1.toSet == l2.toSet

Nếu những gì bạn muốn là "những danh sách này chứa các yếu tố giống nhau, và với cùng số lần lặp lại của mỗi ":

l1.sorted == l2.sorted

Nếu những gì bạn muốn là" những danh sách này chứa các yếu tố giống nhau và có cùng kích thước, nhưng số lần lặp lại của một định yếu tố có thể khác nhau giữa hai danh sách ":

l1.size == l2.size && l1.toSet == l2.toSet

+0

Tôi cũng muốn phục vụ cho các phần tử trùng lặp. Vì vậy, danh sách (1,2,3,3) không nên bằng nhau (Danh sách (3,2,1)) – ssanj

+0

Ok, được chỉnh sửa để phản ánh điều đó :) –

+0

Danh sách (1,2,3,3) .sorted! = Danh sách (3,2,1) – ssanj

9

Trong khi

l1.sorted == l2.sorted 

là đúng, đó là hiệu suất thời gian chạy là O (n log n), vì sự phân loại. Đối với các danh sách lớn, bạn có thể tốt hơn với

l1.groupBy(identity) == l2.groupBy(identity) 

nên là O (n), giả sử thực hiện tốt nhóm.

+0

Trong Scala, tôi không nghĩ rằng giải pháp groupBy sẽ làm việc vì các giá trị của bản đồ sẽ là Mảng, và những giá trị đó sẽ được so sánh bằng cách sử dụng bình đẳng tham chiếu. 'l1.groupBy (identity) .mapValues ​​(_. length) == ...' sẽ hoạt động. – csjacobs24

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