2012-09-07 24 views
6

Tengo dos List<String[]> (listas de conjuntos de cadenas), y me gustaría hacer coincidir los contenidos entre sí. Obviamente == no hace el truco, pero .equals() tampoco parece hacerlo. Entonces, ¿cómo debo verificar si el contenido de las listas de arreglos de cadenas es el mismo?Comparar Lista <String[]>

Por cierto, en ambos casos anteriores obtuve una excepción con el mensaje null.

EDITAR: Ok ... por alguna razón solo funciona x.equals(y), y no y.equals(x). Impar ...

+0

¿Puede proporcionar un fragmento de código de lo que ha intentado? – kosa

+0

"Recibí una excepción con el mensaje ** null ** ... por alguna razón solo funciona x.equals (y), y ** no y.equals (x) **." Creo que 'y' es' nulo', ¿alguna vez lo inicializaste? – Sam

+0

+ Sam lo hago, justo después de 'public class MainActivity extends Activity {'. – RobinJ

Respuesta

0

Sólo .equals() funciona bien, pero de alguna manera solo en una dirección.

Iba a aceptar la primera respuesta a esta pregunta, pero aparentemente el tipo eliminó su respuesta.

+0

si funciona en una dirección, no funciona. estás creando un error aquí que te atormentará más tarde. tanto @Paul Bellora y mi respuesta están bien, quédate con uno de ellos –

5

Quizás la solución más fácil sería usar dos List<List<String>> s en su lugar. Suponiendo que las implementaciones List utilizadas extienden AbstractList, usar equals le dará el comportamiento deseado. De la documentación para AbstractList.equals:

Compara el objeto especificado con esta lista para la igualdad. Devuelve true si y solo si el objeto especificado también es una lista, ambas listas tienen el mismo tamaño, y todos los pares correspondientes de elementos en las dos listas son igual a. (Dos elementos e1 y e2 son iguales si (e1==null ? e2==null : e1.equals(e2)).) En otras palabras, dos listas se definen como si son iguales si contienen los mismos elementos en el mismo orden.

Usted puede envolver fácilmente un String[] en una delgada List<String> aplicación que se extiende AbstractList utilizando Arrays.asList.

EDIT: He aquí un ejemplo:

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 - ¿me gustaría comentar? –

3

Normalmente, usted debe evitar tratar con matrices. son feos y conducen a este tipo de problemas. Si es posible, use List<List<String>>, entonces puede usar .equals() normalmente.

si insiste, podría utilizar una implementación isequal personalizada como la siguiente. la clave es usar 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

Puede utilizar la interfaz Comparable. Implemente el método necesario y puede usar la función List1.compare (List2).

-1

Usando la respuesta de Jon Skeet de how to convert a List to a String (usando Guava), otra opción sería convertir las 2 listas a 2 cadenas y luego compararlas usando equals. Sin bucles

Cuestiones relacionadas