Eliminar elemento de una matriz en Java

    Introducción

    Este tutorial pasará por algunas técnicas comunes para eliminar elementos de matrices Java. Manipular elementos de matriz es una tarea extremadamente común, ya que se pueden encontrar discusiones al respecto en muchos foros, particularmente en StackOverflow.

    Aquí hay una lista de las técnicas y métodos que repasaremos en este artículo:

    • Usando dos matrices
    • ArraysUtils.remove ()
    • Usando un for lazo
    • System.arraycopy ()

    Un breve resumen sobre matrices

    Las matrices son estructuras de datos comunes en muchos lenguajes de programación. Cada arreglo se almacena en un solo bloque de memoria y permite el almacenamiento secuencial y la manipulación simple de elementos:

    Crédito: CodeForWin

    Los elementos se almacenan secuencialmente uno tras otro. Cuando alguien quiere acceder a un elemento en un índice determinado, la aritmética de punteros (que es el mecanismo debajo del capó) permite obtener de manera rápida y eficiente cualquier elemento en particular.

    Si el índice de un elemento solicitado es 3, el mecanismo subyacente simplemente necesita tomar la dirección de memoria del elemento cero y agregar tres veces el tamaño de cada elemento. Dado que todos los elementos de la matriz tienen el mismo tamaño, este tipo de cálculo conduce directamente al elemento con índice 3. Además, esto sucede en O(1) complejidad, lo que significa que es tan rápido como puede ser.

    Lo que dificulta la eliminación de un elemento de matriz es el hecho de que todos los elementos se almacenan secuencialmente en un solo bloque de memoria. Debido a la naturaleza de la ubicación de la memoria de la matriz, es simplemente imposible eliminar el elemento directamente.

    En cambio, para «eliminar» cualquier elemento, todos los elementos subsiguientes deben desplazarse hacia atrás en un lugar. Esto creará la ilusión de que se eliminó un elemento específico.

    Usando dos matrices

    La forma más simple de Java puro para hacer esto es hacer una nueva matriz, un elemento más corto que el original y copiar todos los elementos, excepto el que nos gustaría eliminar, en él:

    int[] copy = new int[array.length - 1];
    
    for (int i = 0, j = 0; i < array.length; i++) {
        if (i != index) {
            copy[j++] = array[i];
        }
    }
    

    Aquí, simplemente estamos iterando sobre la matriz original y copiando elementos de la matriz original en la nueva matriz, omitiendo el que nos gustaría eliminar.

    los copy matriz ahora consta de:

    10, 20, 30, 50, 60, 70, 80, 90, 100
    

    ArrayUtils.remove ()

    En caso de que ya esté usando la biblioteca Apache Commons, puede usar la ArrayUtils.remove() método.

    Antes de trabajar con Apache Commons, queremos agregarlo a nuestro proyecto:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${version}</version>
    </dependency>
    

    Usar el método es realmente sencillo. Simplemente le proporcionamos la matriz de la que nos gustaría eliminar un elemento y su índice:

    int[] array = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int index = 3;
    array = ArrayUtils.remove(array, index);
    

    Luego devuelve la nueva matriz, que se almacena en el array variable:

    10, 20, 30, 50, 60, 70, 80, 90, 100
    

    Usando un bucle for

    La forma aparentemente más sencilla de eliminar un elemento es iterar la matriz manualmente usando un for lazo. Alternativamente, un while El bucle también se puede utilizar pero for es mucho más adecuado para este tipo de tareas.

    Digamos, queremos eliminar el tercer elemento:

    int[] array = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int index = 3;
    

    El elemento correspondiente al índice 3 es 40. Para eliminar este elemento, simplemente «desplazamos» todos los elementos después de él. Esto significa que vamos a iterar a través de todos los elementos después 40 y simplemente «muévelos» un lugar a la izquierda.

    Como no es posible mover un elemento, copiamos su valor. Las copias posteriores sobrescribirán los valores originales y el resultado será como si toda la parte derecha de la matriz se hubiera desplazado hacia la izquierda en uno:

    for (int i = index; i < array.length - 1; i++) {
        array[i] = array[i + 1];
    }
    

    Si fuimos e imprimimos la matriz modificada, este sería el resultado:

    10, 20, 30, 50, 60, 70, 80, 90, 100, 100
    

    Las matrices son de longitud fija. El último elemento, 100, se duplica debido a esto. Usando una sola matriz, es imposible eliminar un elemento sin llenar el nuevo espacio con algún valor.

    Puede anularlo con un valor ficticio, como -1, pero esta solución no es muy válida. Esto se elimina mediante el uso de dos matrices.

    System.arraycopy

    Una forma abreviada de hacer exactamente lo mismo que antes pero en una sola línea de código es con el System.arraycopy() método:

    public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
    

    El método acepta una matriz de origen y la posición desde la que comenzar a copiar. También acepta una matriz de destino y la posición en la que comenzar a copiar. El argumento final es el número de elementos que se copiarán de la matriz de origen.

    los arraycopy se utiliza generalmente para copiar contenido de alguna matriz de origen a alguna matriz de destino. Sin embargo, también podemos copiar una matriz, o una parte de ella, en sí misma. Esto nos permite mover una parte a la izquierda como la última vez:

    int[] array = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int index = 3;
    

    Para eliminar el elemento, solo necesitamos escribir esta línea de código:

    System.arraycopy(array, index + 1, array, index, array.length - index - 1);
    

    El método copiará todos los elementos de la matriz de origen (array) comenzando una posición a la derecha del index. Los elementos se copiarán en la misma matriz (array) comenzando exactamente en index. El resultado será un desplazamiento percibido de todos los elementos a la derecha del elemento que queríamos eliminar.

    Si imprimimos el resultado, todavía veríamos el elemento 100 siendo duplicado por la misma razón que en la sección anterior. En la siguiente sección, mostraremos cómo eliminar este problema por completo.

    Conclusión

    En este tutorial, mostramos algunas formas de eliminar elementos de matriz. Algunos son rápidos y sucios, mientras que otros requieren una sobrecarga adicional, como el uso de bibliotecas adicionales. Siempre es mejor pensar en estas cosas de antemano para tener una idea de qué tipo de enfoque es el adecuado para una situación determinada.

    La lista de técnicas que se muestran en este tutorial no es de ninguna manera exhaustiva. Hay muchas formas de ser creativo en la programación, por lo que estamos seguros de que puede encontrar otros enfoques interesantes para eliminar elementos de las matrices.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *