¿Cómo elimino objetos de una matriz en Java?
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?
[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.asList
en lugar de Collections.singleton
: singleton está limitado a una entrada, mientras que el asList
enfoque 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 new
cada 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).
Una alternativa en Java 8:
String[] filteredArray = Arrays.stream(array)
.filter(e -> !e.equals(foo)).toArray(String[]::new);
Haga una List
matriz 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.
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/