2011-01-31 11 views
9

Tengo un ArrayList<int[]>, y le agrego una matriz.Usar contiene en una ArrayList con matrices de enteros

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

Supongamos que quiero saber si j contiene una matriz que tiene {1,2} en ella sin necesidad de utilizar w, ya que voy a estar llamando desde otra clase. Así, se crea una nueva matriz con {1,2} en ella ...

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

... pero esto sería falso de vuelta a pesar de que w se añadió a la lista, y w contiene exactamente la misma matriz como t.

¿Hay alguna manera de usar contiene tal que solo pueda verificar si uno de los elementos del ArrayList tiene el valor de matriz {1,2}?

Respuesta

7

Las matrices solo pueden compararse con Arrays.equals().

Probablemente desee un ArrayList de 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

Desafortunadamente eso no resolverá el problema real. ¿Qué pasa si 'w' tenía' 1,2,3'? –

+0

Pensé que el usuario quería comparar matrices exactas, no mencionó una porción de la matriz. –

+0

Tienes razón, tal vez estaba malinterpretando. –

0

Necesita repetir la lista y verificar manualmente si una matriz coincide con sus criterios.

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

Si desea una coincidencia exacta, se puede hacer uso de Arrays.equals(). Sin embargo, no creo que haya una función de biblioteca para hacer una que contenga todo en una matriz, por lo que tendría que escribirla usted mismo si eso es lo que quería.

0

de API de Java:

public boolean contains(Object o) 

devuelve verdadero si esta lista contiene el elemento especificado . Más formalmente, devuelve verdadero si y solo si esta lista contiene al menos un elemento e tal que (o==null ? e==null : o.equals(e)).

desde int[] es un método primitivo, bastante seguro que no existe .equals, así que creo que siempre sería falso.

¿Recomendaría una manera diferente de almacenar los datos? tal vez con una clave de algún tipo?

+0

'int []' no es realmente un primitivo. Todas las matrices son un 'Objeto' y heredan su implementación de' equals() 'que devuelve verdadero si los operandos son iguales * instancia * (' == ') –

+0

int [] no es primitivo. int es. int [] extends Object, pero no anula 'equals()' –

+0

ah my b. Estaba tratando de entender que no anula el método equals() y, por lo tanto, no se puede usar para contains. – eosgood

6

El problema aquí es que las matrices no anulan Object.equals(Object), así que la comparación entre dos entradas de la lista ocurre con los iguales (por defecto) de aplicación

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

Así que hay que iterar sobre la lista y comprobar todas las entradas usando Arrays.equals(int[], int[]).Aquí está un método de ayuda que hace esto:

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; 
} 

Actualización: Desde Java 8, esto tiene mucho más simple:

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

"contiene" controles de contrato para la igualdad. Entonces en tu caso lo que está fallando es la igualdad de int []. Como Array no anula el método de igual de Object, necesitará una solución para verificar la contención.

Si necesita verificar la contención dentro del Array, no tendrá más remedio que recorrer el ArrayList y hacer la comparación usted mismo.

0

Dos matrices de matriz Java son iguales si tienen la misma referencia de objeto. El contenido no importa

Estás buscando una forma de comprobar si tienen el mismo contenido. Esto podría ayudar:

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 (!) 

Si el orden no debe afectar la igualdad, entonces tendrá que implementar un método de igual estático usted mismo.

0

En primer lugar, no son la misma referencia de objeto, por lo que no son iguales. equals() devolverá falso. Para su condición, deberá implementar un método para compararlos usted mismo.

Cuestiones relacionadas