149 votos

Eliminar un elemento de un Array o matriz (Java)

¿Hay alguna forma rápida (y atractiva) de eliminar un elemento de una matriz (Array) en Java?

240voto

Peter Lawrey Puntos 229686

Podrías usar el ArrayUtils de Commons Lang.

array = ArrayUtils.removeElement(array, element)

Javadocs

48voto

Adam Jaskiewicz Puntos 7485

Su pregunta no es muy clara. Por su propia respuesta, puedo decir mejor lo que está tratando de hacer:

public static String[] removeElements(String[] input, String deleteMe) {
    List result = new LinkedList();

    for(String item : input)
        if(!deleteMe.equals(item))
            result.add(item);

    return result.toArray(input);
}

NB: Esto no está probado. La comprobación de errores se deja como un ejercicio para el lector (yo tiraría IlegalArgumentException si la entrada o el borrado de Me es nulo; una lista vacía en la entrada de la lista nula no tiene sentido. Quitar cadenas nulas de la matriz puede tener sentido, pero también lo dejaré como ejercicio; actualmente, lanzará un NPE cuando intente llamar a los iguales en deleteMe si deleteMe es nulo).

Las decisiones que tomé aquí:

Usé una lista de enlaces. La iteración debe ser igual de rápida, y evitar cualquier redimensionamiento, o la asignación de una lista demasiado grande si terminas borrando muchos elementos. Podrías usar una ArrayList, y ajustar el tamaño inicial a la longitud de la entrada. Probablemente no habría mucha diferencia.

41voto

Bill K Puntos 32115

La mejor opción sería usar una colección, pero si eso queda fuera por alguna razón, usar:

java.lang.Object , int, java.lang.Object, int, int

Mira a los doctores. Puedes usarlo para copiar de y a la misma matriz con un desplazamiento ligeramente diferente.

Así que para eliminar el elemento "an":

public void removeElement(Object[] a, int del) {
    System.arraycopy(a,del+1,a,del,a.length-1-del);
}

Editar en respuesta a un comentario:

No es otra buena manera, es realmente la única manera aceptable.

Para asignar una colección (crea un nuevo Array), luego borra un elemento (lo cual la colección hará usando arraycopy) y luego llama aArray en él (crea un SEGUNDO nuevo Array) por cada borrado nos lleva al punto en el que no es un problema de optimización, es una programación criminalmente mala.

Suponga que tiene un Array que consume, digamos, 100 mb de carnero. Ahora quieres iterar sobre él y borrar 20 elementos.

Inténtalo...

Sé que usted ASUME que no va a ser tan grande, o que si borrara tantos a la vez lo codificaría de manera diferente, pero he fijado un montón de código en el que alguien hizo suposiciones como esa.

37voto

Vlad Gudim Puntos 10161

No se puede eliminar un elemento de la matriz básica de Java. Echa un vistazo a varias colecciones y a la lista de matrices.

15voto

jelovirt Puntos 3531

La solución de aspecto agradable sería usar una lista en lugar de una matriz en primer lugar.

List.remove(index)

Si tú tienen para utilizar las matrices, dos llamadas a System.arraycopy será probablemente el más rápido.

Foo[] result = new Foo[source.length - 1];
System.arraycopy(source, 0, result, 0, index);
if (source.length != index) {
    System.arraycopy(source, index + 1, result, index, source.length - index - 1);
}

( Arrays.asList también es un buen candidato para trabajar con matrices, pero no parece apoyar remove .)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X