2012-09-07 42 views
6

Tôi có hai danh sách chuỗi chuỗi List<String[]> và tôi muốn đối sánh nội dung với nhau. Rõ ràng == không thực hiện thủ thuật, nhưng .equals() dường như không làm điều đó. Vì vậy, làm thế nào tôi nên kiểm tra xem các nội dung của danh sách mảng chuỗi là như nhau?So sánh Danh sách <String[]>

Nhân tiện, trong cả hai trường hợp trên, tôi có ngoại lệ với thông báo null.

CHỈNH SỬA: Ok ... vì một số lý do chỉ x.equals(y) hoạt động và không y.equals(x). Odd ...

+0

Bạn có thể cung cấp đoạn mã về những gì bạn đã thử không? – kosa

+0

"Tôi có ngoại lệ với thông báo ** null ** ... vì một số lý do chỉ x.equals (y) hoạt động và ** không phải y.equals (x) **." Tôi tin rằng 'y' là' null', bạn có bao giờ khởi tạo nó không? – Sam

+0

+ Sam tôi làm, ngay sau khi lớp công khai MainActivity mở rộng Hoạt động {'. – RobinJ

Trả lời

0

Chỉ .equals() hoạt động tốt, nhưng bằng cách nào đó chỉ theo một hướng.

Tôi sẽ chấp nhận câu trả lời đầu tiên cho câu hỏi này, nhưng rõ ràng anh chàng đã xóa câu trả lời của mình.

+0

nếu nó hoạt động theo một hướng không hoạt động. bạn đang tạo ra một lỗi ở đây sẽ ám ảnh bạn sau này. cả @Paul Bellora và câu trả lời của tôi đều ổn với một trong số họ –

5

Có lẽ giải pháp đơn giản nhất là sử dụng hai số List<List<String>> s thay thế. Giả sử triển khai List được sử dụng mở rộng AbstractList, sử dụng equals sẽ cung cấp cho bạn hành vi mong muốn. Từ tài liệu cho AbstractList.equals:

So sánh đối tượng được chỉ định với danh sách này để bình đẳng. Trả về true nếu và chỉ khi đối tượng được chỉ định cũng là danh sách, cả hai danh sách có cùng kích thước và tất cả các phần tử tương ứng trong hai danh sách là bằng. (Hai thành phần e1e2 bằng nhau nếu (e1==null ? e2==null : e1.equals(e2)).) Nói cách khác, hai danh sách được xác định là bằng nhau nếu chúng chứa cùng một phần tử theo cùng một thứ tự.

Bạn có thể dễ dàng quấn một String[] trong một List<String> thi mỏng kéo dài AbstractList bằng cách sử dụng Arrays.asList.

EDIT: Dưới đây là một ví dụ:

String[] array1 = {"1", "2", "3"}; 
String[] array2 = {"4", "7"}; 

String[] array3 = {"1", "2", "3"}; 
String[] array4 = {"4", "7"}; 

List<List<String>> lst1 = new ArrayList<>(); 
lst1.add(Arrays.asList(array1)); 
lst1.add(Arrays.asList(array2)); 

List<List<String>> lst2 = new ArrayList<>(); 
lst2.add(Arrays.asList(array3)); 
lst2.add(Arrays.asList(array4)); 

System.out.println(lst1.equals(lst2)); //prints true 
+0

@Downvoter - chăm sóc bình luận? –

3

Thông thường bạn nên tránh đối phó với Mảng. chúng xấu xí và dẫn đến những vấn đề này. Nếu có thể sử dụng List<List<String>> thì bạn có thể sử dụng .equals() bình thường.

nếu bạn nhấn mạnh, bạn có thể sử dụng triển khai isequal tùy chỉnh như dưới đây. chính là để sử dụng Arrays.equals()

public class DemoEquals { 
    List<String[]> listOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"}); 
    List<String[]> listOneOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"}); 
    List<String[]> listTwo = (List<String[]>) Arrays.asList(new String[]{"2one1", "2one2"}, new String[]{"2two1"}); 

    private boolean isEqual(List<String[]> list1, List<String[]> list2) { 
     if (list1.size() != list2.size()) return false; 
     for (int i = 0; i < list1.size(); i++) { 
      if (!Arrays.equals(list1.get(i), list2.get(i))) return false; 
     } 
     return true; 
    } 
    @SuppressWarnings("unchecked") 
    private void isEqual() { 
     //prints true 
     System.out.println(isEqual(Collections.EMPTY_LIST, Collections.EMPTY_LIST)); 
     //prints true 
     System.out.println(isEqual(listOne, listOne)); 
     //prints true 
     System.out.println(isEqual(listOne, listOneOne)); 
     //prints false 
     System.out.println(isEqual(listOne, listTwo)); 
     //prints false 
     System.out.println(isEqual(listOne, Collections.EMPTY_LIST)); 

    } 
    public static void main(String[] args) { 
     new DemoEquals().isEqual(); 
    } 
} 
0

Bạn có thể sử dụng giao diện Comparable. Thực hiện phương thức cần thiết và bạn có thể sử dụng hàm List1.compare (List2).

-1

Sử dụng câu trả lời của Jon Skeet how to convert a List to a String (sử dụng ổi), một tùy chọn khác là chuyển đổi 2 danh sách thành 2 chuỗi và sau đó so sánh chúng với equals. Không có vòng lặp.

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