2011-01-31 78 views
9

Tôi có một ArrayList<int[]> và tôi thêm một mảng vào đó.Sử dụng chứa trên một ArrayList với các mảng số nguyên

ArrayList<int[]> j = new ArrayList<int[]>(); 
int[] w = {1,2}; 
j.add(w); 

Giả sử tôi muốn biết nếu j chứa một mảng có {1,2} trong nó mà không sử dụng w, vì tôi sẽ được gọi đó là từ một lớp khác. Vì vậy, tôi tạo ra một mảng mới với {1,2} trong nó ...

int[] t = {1,2}; 
return j.contains(t); 

... nhưng điều này sẽ trả về false mặc dù w đã được bổ sung vào danh sách, và w chứa các mảng chính xác giống như t.

Có cách nào để sử dụng chứa như vậy mà tôi chỉ có thể kiểm tra xem một trong các thành phần của ArrayList có giá trị mảng {1,2} không?

Trả lời

7

Mảng chỉ có thể được so sánh với Arrays.equals().

Bạn có thể muốn có một ArrayList của ArrayLists.

ArrayList<ArrayList<Integer>> j = new ArrayList<ArrayList<Integer>>(); 
ArrayList<Integer> w = new ArrayList<Integer>(); 
w.add(1); w.add(2); 
j.add(w); 
ArrayList<Integer> t = new ArrayList<Integer>(); 
t.add(1); t.add(2); 
return j.contains(t); // should return true. 
+0

Điều đó sẽ không giải quyết được sự cố thực sự. Nếu 'w' có' 1,2,3' thì sao? –

+0

Tôi nghĩ người dùng muốn so sánh các mảng chính xác, anh ta không đề cập đến một phần của mảng. –

+0

Bạn nói đúng, có thể tôi đã hiểu sai. –

0

Bạn cần phải lặp qua danh sách và kiểm tra xem một mảng có khớp với tiêu chí của bạn theo cách thủ công hay không.

public static boolean containsSubArray(List<int[]> j, int[] sub) { 
    for (int[] arr : j) { 
     if (arr contains elements of sub) { 
     return true; 
     } 
    } 
    return false; 
} 

Nếu bạn muốn khớp chính xác, bạn có thể sử dụng Arrays.equals(). Tôi không nghĩ rằng có một chức năng thư viện để làm một chứa tất cả trên một mảng mặc dù, vì vậy bạn sẽ phải viết rằng chính mình nếu đó là những gì bạn muốn.

0

từ java api:

public boolean contains(Object o) 

trả về true nếu danh sách này chứa các yếu tố quy định . Chính thức hơn, trả về true nếu và chỉ khi danh sách này chứa ít nhất một phần tử e như vậy rằng (o==null ? e==null : o.equals(e)).

kể từ int[] là nguyên thủy, im khá chắc chắn không có phương thức .equals tồn tại để tôi đoán nó sẽ luôn trả về false.

Tôi muốn giới thiệu một cách lưu trữ dữ liệu khác? có lẽ với một chìa khóa của một số loại?

+0

'int []' không thực sự là nguyên thủy. Tất cả các mảng là một 'Object' và kế thừa việc thực thi' equals() 'trả về true nếu các toán hạng là cùng một * instance * (' == ') –

+0

int [] không phải là nguyên thủy. int là. int [] mở rộng Object, nhưng không ghi đè 'equals()' –

+0

ah b. tôi đã cố gắng để có được ở thực tế là nó không ghi đè lên phương thức equals() và do đó không thể được sử dụng cho chứa. – eosgood

6

Vấn đề ở đây là mảng không ghi đè Object.equals(Object), Vì vậy, việc so sánh giữa hai mục danh sách xảy ra với equals mặc định() thực hiện

// from Object.class 
public boolean equals(Object obj) { 
return (this == obj); 
} 

Vì vậy, bạn phải lặp trên danh sách và rà soát tất cả các mục sử dụng Arrays.equals(int[], int[]).Dưới đây là một phương pháp trợ giúp thực hiện điều này:

public static boolean isInList(
    final List<int[]> list, final int[] candidate){ 

    for(final int[] item : list){ 
     if(Arrays.equals(item, candidate)){ 
      return true; 
     } 
    } 
    return false; 
} 

Cập nhật: Kể từ Java 8, điều này đã có rất nhiều đơn giản:

public static boolean isInList(
     final List<int[]> list, final int[] candidate) { 

    return list.stream().anyMatch(a -> Arrays.equals(a, candidate)); 
      // ^-- or you may want to use .parallelStream() here instead 
} 
0

"chứa" kiểm tra hợp đồng cho bình đẳng. Vì vậy, trong trường hợp của bạn những gì là thất bại là bình đẳng của int []. Vì Array không ghi đè phương thức bằng từ Object, bạn sẽ cần một giải pháp thay thế để kiểm tra ngăn chặn.

Nếu bạn cần kiểm tra ngăn chặn trong số Array thì bạn không còn lựa chọn nào khác ngoài việc lặp qua ArrayList và tự mình so sánh.

0

Hai mảng mảng java bằng nhau, chúng có cùng tham chiếu đối tượng. Nội dung không quan trọng.

Bạn đang tìm cách kiểm tra xem chúng có nội dung bình đẳng không. Điều này có thể giúp:

Arrays.equals(new int[]{1,2}, new int[]{1,2}); // evaluates to true 
Arrays.equals(new int[]{1,2}, new int[]{2,1}); // evaluates to false (!) 

Nếu thứ tự không ảnh hưởng đến bình đẳng, thì bạn sẽ phải tự thực hiện phương pháp equals tĩnh.

0

Đầu tiên chúng không phải là cùng một tham chiếu đối tượng, vì vậy chúng không bằng nhau. bằng() sẽ trả về false. Đối với tình trạng của bạn, bạn sẽ cần phải thực hiện một phương pháp để tự mình so sánh chúng.

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