2011-12-01 35 views
6

Làm cách nào để so sánh hai mảng có cùng một mục hay không?Làm thế nào tôi có thể so sánh hai mảng có cùng một mục hoặc không có trong groovy?

def a = [1, 3, 2] 
def b = [2, 1, 3] 
def c = [2, 4, 3, 1] 

một & b là chứa cùng một mặt hàng, nhưng một & c không.

+0

Đó là danh sách, không phải mảng ... Ý của bạn là gì? –

+0

chúng là mảng – nikli

+4

@nikli trong mã ở trên chúng không phải là mảng, chúng là danh sách –

Trả lời

13

Bạn có thể thử chuyển đổi chúng thành Bộ và sau đó so sánh chúng, vì sự bình đẳng trong Bộ được xác định là có cùng các phần tử bất kể thứ tự.

assert a as Set == b as Set 
assert a as Set != c as Set 
+9

Điều đó hoạt động miễn là các phần tử danh sách không bị trùng lặp. Đối với các danh sách có thể có bản sao, phương pháp này sẽ không phát hiện được nếu chúng có cùng số lượng của mỗi phần tử riêng lẻ. (Tôi không nhận được ấn tượng này là một cái gì đó OP quan tâm để câu trả lời của bạn vẫn còn hợp lệ, chỉ là một FYI cho những người khác mà tìm thấy câu trả lời này). –

8

Đơn giản chỉ cần sắp xếp các kết quả và so sánh một cách dễ dàng, nếu danh sách của bạn không phải là quá lớn:

def a = [1, 3, 2] 
def b = [2, 1, 3] 
def c = [2, 4, 3, 1] 

def haveSameContent(a1, a2) { 
    a1.sort(false) == a2.sort(false) 
} 

assert haveSameContent(a, b) == true 
assert haveSameContent(a, c) == false 

Các false truyền cho sort là để ngăn chặn tại chỗ sắp xếp lại. Nếu bạn có thể thay đổi thứ tự của danh sách, bạn có thể xóa nó và có thể đạt được một chút hiệu suất.

+0

Không có điểm nào khi so sánh giá trị boolean với 'true' hoặc' false'. Tôi nghĩ rằng 'assert hasSameContent (a, b)' và 'assert! HasSameContent (a, c)' đọc tốt hơn. – epidemian

+0

Đó thực sự là vấn đề quan điểm. Tôi nghĩ rằng nó làm cho nó rõ ràng hơn với '== false' mà bạn mong đợi một đầu ra sai. Nó khá dễ dàng để bỏ lỡ một dấu chấm than đơn khi lướt mã. (Ngoài ra, đừng quên, do sự thật Groovy, '! 0' hoặc'! [] 'Trả về' true', nhưng 'khẳng định [] == false' sẽ thất bại.) – OverZealous

+0

Tôi đã thử nghiệm, nhưng không đúng – nikli

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