¿Cómo elimino objetos de una matriz en Java?

Resuelto ramayac asked hace 16 años • 20 respuestas

Dada una matriz de n objetos, digamos que es una matriz de cadenas y tiene los siguientes valores:

foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";

¿Qué tengo que hacer para borrar/eliminar todas las cadenas/objetos iguales a "a" en la matriz?

ramayac avatar Sep 22 '08 06:09 ramayac
Aceptado

[Si desea algún código listo para usar, desplácese hasta mi "Editar3" (después del corte). El resto queda aquí para la posteridad.]

Para desarrollar la idea de Dustman :

List<String> list = new ArrayList<String>(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);

Editar: ahora estoy usando Arrays.asListen lugar de Collections.singleton: singleton está limitado a una entrada, mientras que el asListenfoque le permite agregar otras cadenas para filtrar más tarde Arrays.asList("a", "b", "c"):.

Edit2: el enfoque anterior conserva la misma matriz (por lo que la matriz sigue teniendo la misma longitud); el elemento después del último se establece en nulo. Si desea una nueva matriz con el tamaño exacto requerido, utilice esto en su lugar:

array = list.toArray(new String[0]);

Edit3: si usa este código con frecuencia en la misma clase, puede considerar agregar esto a su clase:

private static final String[] EMPTY_STRING_ARRAY = new String[0];

Entonces la función se convierte en:

List<String> list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);

Esto dejará de ensuciar su montón con matrices de cadenas vacías inútiles que, de otro modo, se editarían newcada vez que se llama a su función.

La sugerencia de cynicalman (ver comentarios) también ayudará con el montón de basura y, para ser justos, debo mencionarlo:

array = list.toArray(new String[list.size()]);

Prefiero mi enfoque, porque puede ser más fácil equivocarse en el tamaño explícito (por ejemplo, llamar size()a la lista incorrecta).

C. K. Young avatar Sep 21 '2008 23:09 C. K. Young

Una alternativa en Java 8:

String[] filteredArray = Arrays.stream(array)
    .filter(e -> !e.equals(foo)).toArray(String[]::new);
Vitalii Fedorenko avatar Apr 20 '2014 23:04 Vitalii Fedorenko

Haga una Listmatriz con Arrays.asList()y llame remove()a todos los elementos apropiados. Luego llame toArray()a la 'Lista' para volver a formar una matriz.

No tiene un gran rendimiento, pero si lo encapsulas correctamente, siempre podrás hacer algo más rápido más adelante.

Dustman avatar Sep 21 '2008 23:09 Dustman

Puedes usar una biblioteca externa:

org.apache.commons.lang.ArrayUtils.remove(java.lang.Object[] array, int index)

Está en el proyecto Apache Commons Lang http://commons.apache.org/lang/

bugs_ avatar Feb 04 '2011 14:02 bugs_