2012-09-07 22 views
6

Mam dwa List<String[]> (listy tablic ciągów) i chciałbym dopasować zawartość ze sobą. Oczywiście == nie robi lewy, ale wydaje się, że nie robi tego również .equals(). Jak więc sprawdzić, czy zawartość list ciągów tablic jest taka sama?Porównaj listę <String[]>

Przy okazji, w obu powyższych przypadkach otrzymałem wyjątek z komunikatem null.

EDYTOWANIE: OK ... z jakiegoś powodu działa tylko x.equals(y), a nie y.equals(x). Odd ...

+0

Czy możesz podać fragment kodu wypróbowanego? – kosa

+0

"Otrzymałem wyjątek z komunikatem ** null ** ... z jakiegoś powodu działa tylko x.equals (y), a ** not y.equals (x) **." Wierzę, że 'y' jest' null', czy kiedykolwiek go zainicjowałeś? – Sam

+0

+ Sam robię, zaraz po 'publicznej klasie MainActivity rozszerza działalność {'. – RobinJ

Odpowiedz

0

Po prostu .equals() działa dobrze, ale jakoś tylko w jednym kierunku.

Chciałem zaakceptować pierwszą odpowiedź na to pytanie, ale najwyraźniej facet usunął odpowiedź.

+0

jeśli działa w jednym kierunku, nie działa. tworzysz tutaj błąd, który prześladuje Cię później. zarówno @ Paul Bellora i moja odpowiedź są dobrze trzymać z jednym z nich –

5

Być może najłatwiejszym rozwiązaniem byłoby użycie dwóch List<List<String>> s. Zakładając, że użyte implementacje List rozciągają się na AbstractList, użycie equals da pożądane zachowanie. Z dokumentacji AbstractList.equals:

Porównuje określony obiekt z tej listy do równości. Zwroty wtedy i tylko wtedy, gdy podany obiekt jest również listą, obie listy mają taki sam rozmiar, a wszystkie odpowiadające sobie pary elementów na dwóch listach są równe równe. (Dwa elementy: e1 i e2 są równe, jeśli (e1==null ? e2==null : e1.equals(e2)).) Innymi słowy, dwie listy są zdefiniowane dla są równe, jeśli zawierają te same elementy w tej samej kolejności.

można łatwo owinąć String[] cienką List<String> realizacji, która rozciąga AbstractList za pomocą Arrays.asList.

EDIT: Oto przykład:

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

@Dvvovator - proszę o komentarz? –

3

Zazwyczaj należy unikać czynienia z tablicami. są brzydcy i prowadzą do tego rodzaju problemów. Jeśli to możliwe, użyj List<List<String>>, aby móc normalnie korzystać z .equals().

jeśli nalegasz, możesz użyć niestandardowej implementacji, jak poniżej. kluczem jest użycie 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

Można użyć interfejsu porównywalne. Zastosuj potrzebną metodę i możesz użyć funkcji List1.compare (List2).

-1

Za pomocą odpowiedzi Jona Skeeta na how to convert a List to a String (przy użyciu Guava), inną opcją byłoby przekonwertowanie 2 list na 2 ciągi, a następnie porównanie ich za pomocą equals. Bez pętli.