2013-01-24 36 views
25

Có thể là một đơn giản một-liner rằng tôi chỉ không tìm thấy ở đây, nhưng đây là câu hỏi của tôi:ArrayList chứa một ArrayList

Làm thế nào để kiểm tra xem một ArrayList chứa tất cả các đối tượng trong ArrayList khác. Tôi đang tìm kiếm (nếu nó tồn tại) cho một cái gì đó dọc theo dòng:

//INCORRECT EXAMPLE: 
if(one.contains(two)) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

Ví dụ:

ArrayList one = {1, 2, 3, 4, 5} 

ArrayList two = {1, 2, 3} --> True 
ArrayList two = {} --> True 
ArrayList two = {1, 2, 3, 4, 5} --> True 
ArrayList two = {1, 5, 2} --> True 
ArrayList two = {1, 7, 4} --> False 
ArrayList two = {0, 1, 3} --> False 
ArrayList two = {4, 5, 6} --> False 
ArrayList two = {7, 8, 9} --> False 
+1

{1,3,2} = đúng hay sai? – cowls

+0

đúng. nhờ cập nhật bệnh – Evorlor

+0

trong trường hợp đó bạn muốn chứaAllAll (đã là câu trả lời) – cowls

Trả lời

49

Có một phương pháp được gọi là containsAll được khai báo trong giao diện java.util.Collection. Trong thiết lập của bạn one.containsAll(two) cho câu trả lời mong muốn.

3

Mã của bạn trong ví dụ này không có ý nghĩa, nhưng đây là một ví dụ anyway.

ArrayList<Integer> one, two; 
//initialize 
boolean good = true; 
for (int i = 0; i < two.size(); i ++) { 
    if (!(one.contains(two.get(i))) { 
     good = false; 
     break; 
    } 
} 

Nó chỉ đơn giản lặp qua tất cả các yếu tố và kiểm tra two 's để xem nếu họ đang ở one.

Sau đó, boolean good chứa giá trị bạn muốn.

Xem ArrayList#contains.

EDIT: oh wow, tôi hoàn toàn quên containsAll. Ồ, đây là một cách thay thế để làm điều đó nếu bạn thực sự muốn hiểu nó.

+3

Khi nó 'false', bạn nên 'break'. Không cần phải kiểm tra phần còn lại. –

+0

@LeeMeador Yep, cảm ơn – Doorknob

+2

Cách khác (thay vì nghỉ) bạn có thể làm: cho (int i = 0; i MadcoreTom

11

mỗi giao diện liệt kê:

myList.containsAll(...); 
10

Hãy xem containsAll(Collection<?> c) phương pháp từ giao diện List. Tôi nghĩ rằng đó là những gì bạn đang tìm kiếm.

3

Bạn có thể sử dụng phương thức containsAll của danh sách để thực hiện kiểm tra. Tuy nhiên, đây là một hoạt động tuyến tính. Nếu danh sách là lớn, bạn nên chuyển nó sang HashSet đầu tiên, và sau đó thực hiện containsAll:

HashSet tmp = new HashSet(one); 
if (tmp.containsAll(two)) { 
    ... 
} 

Nếu chiều dài của oneN và độ dài của hai là M, giải pháp này có độ phức tạp thời gian của O(M+N); "đồng bằng" containsAll có độ phức tạp của O(M*N), điều này có thể tồi tệ hơn đáng kể.

2

Dưới đây là một ví dụ sử dụng containsAll() mà tôi đã sử dụng để khẳng định rằng hai mảng đều bình đẳng trong JUnit thử nghiệm:

List<String> expected = new ArrayList<String>(); 
expected.add("this"); 
expected.add("that"); 
expected.add("another"); 

List<String> actual = new ArrayListString(); 
actual.add("another"); 
actual.add("that"); 
actual.add("this"); 

Assert.assertTrue("The lists do not match!", expected.containsAll(actual));