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 *