Eliminar elemento de la matriz y reducir la matriz

¿Cómo puedo eliminar un elemento de una matriz y luego cambiar el tamaño de la matriz al tamaño más pequeño? Del mismo modo, ¿cómo puedo boost la capacidad si necesito agregar otro artículo?

El tamaño de una matriz de Java es fijo cuando lo asigna, y no se puede cambiar.

  • Si desea “crecer” o “reducir” una matriz existente, debe asignar una nueva matriz del tamaño adecuado y copiar los elementos de la matriz; por ejemplo, utilizando System.arraycopy(...) o Arrays.copyOf(...) . Un bucle de copia también funciona, aunque parece un poco torpe … IMO.

  • Si desea “eliminar” un elemento o elementos de una matriz (en el verdadero sentido … no solo reemplazarlos por null ), debe asignar una nueva matriz más pequeña y copiar los elementos que desea conservar.

Existen alternativas en forma de bibliotecas de terceros (por ejemplo, Apache Commons ArrayUtils ), pero es posible que desee considerar si vale la pena agregar una dependencia de biblioteca solo por el bien de un método que podría implementar usted mismo con 5-10 líneas de código.


Es mejor (es decir, más simple … y en muchos casos, más eficiente 1 ) utilizar una clase List lugar de una matriz. Esto se encargará (al menos) de boost el almacenamiento de respaldo. Y hay operaciones que se encargan de insertar y eliminar elementos en cualquier parte de la lista.

Por ejemplo, la clase ArrayList usa una matriz como respaldo y crece automáticamente la matriz según sea necesario. No reduce automáticamente el tamaño de la matriz de respaldo, pero puede indicarle que haga esto utilizando el método trimToSize() ; p.ej

 ArrayList l = ... l.remove(21); l.trimToSize(); // Only do this if you really have to. 

1 – Digo que es “más eficiente en muchos casos” porque ArrayList usa una estrategia simple de “doble tamaño” cuando necesita hacer crecer la matriz de respaldo. Esto significa que si creces la lista añadiéndola repetidamente, cada elemento se copiará en promedio un tiempo extra. Por el contrario, si hiciera esto con una matriz, terminaría copiando cada elemento de la matriz casi N / 2 veces en promedio.

No puede cambiar el tamaño de la matriz, per se, pero puede crear una nueva matriz y copiar de manera eficiente los elementos de la matriz anterior a la nueva matriz usando alguna función de utilidad como esta:

 public static int[] removeElement(int[] original, int element){ int[] n = new int[original.length - 1]; System.arraycopy(original, 0, n, 0, element ); System.arraycopy(original, element+1, n, element, original.length - element-1); return n; } 

Un mejor enfoque, sin embargo, sería utilizar una ArrayList (o una estructura de Lista similar) para almacenar sus datos y luego usar sus métodos para eliminar elementos según sea necesario.

El uso de ArrayUtils.removeElement(Object[],Object) de org.apache.commons.lang es, de lejos, la forma más sencilla de hacerlo.

 int[] numbers = {1,2,3,4,5,6,7}; //removing number 1 numbers =(int[])ArrayUtils.removeElement(numbers, 1); 

Dado que una matriz tiene un tamaño fijo que se asigna cuando se crea, su única opción es crear una nueva matriz sin el elemento que desea eliminar.

Si el elemento que desea eliminar es el último elemento de la matriz, esto se vuelve fácil de implementar usando Arrays.copy :

 int a[] = { 1, 2, 3}; a = Arrays.copyOf(a, 2); 

Después de ejecutar el código anterior, a apuntará a una nueva matriz que contiene solo 1, 2.

De lo contrario, si el elemento que desea eliminar no es el último, debe crear una nueva matriz en tamaño-1 y copiar todos los elementos excepto la que desea eliminar.

El enfoque anterior no es eficiente. Si necesita administrar una lista mutable de elementos en la memoria, mejor use una Lista. Específicamente, LinkedList eliminará un elemento de la lista en O(1) (el más rápido teóricamente posible).

Creé esta función o clase. Soy un poco nuevo, pero mi amigo también lo necesitaba, así que creé esto:

 public String[] name(int index, String[] z ){ if(index > z.length){ return z; } else { String[] returnThis = new String[z.length - 1]; int newIndex = 0; for(int i = 0; i < z.length; i++){ if(i != index){ returnThis[newIndex] = z[i]; newIndex++; } } return returnThis; } } 

Dado que es bastante revelador, pensé que lo publicaría aquí.

 object[] newarray = new object[oldarray.Length-1]; for(int x=0; x < array.Length; x++) { if(!(array[x] == value_of_array_to_delete)) // if(!(x == array_index_to_delete)) { newarray[x] = oldarray[x]; } } 

No hay forma de reducir el tamaño de una matriz una vez creada, pero puede copiar el contenido en otra matriz de menor tamaño.

Las matrices tienen un tamaño fijo, no puede cambiar su tamaño después de crearlas. Puede eliminar un elemento existente configurándolo como null :

 objects[4] = null; 

Pero no podrá eliminar esa ranura completa de la matriz y reducir su tamaño en 1.

Si necesita una matriz de tamaño dynamic, puede usar una ArrayList . Con él, puede add() y remove() objetos, y crecerá y disminuirá según sea necesario.

sin utilizar el método System.arraycopy puede eliminar un elemento de una matriz con la siguiente

  int i = 0; int x = 0; while(i < oldArray.length){ if(oldArray[i] == 3)i++; intArray[x] = oldArray[i]; i++; x++; } 

donde 3 es el valor que desea eliminar.

Siempre puede expandir una matriz simplemente incrementando el tamaño de la misma al crear una matriz o también puede cambiar el tamaño después de la creación, pero para reducir o eliminar elementos. La solución alternativa sin crear una nueva matriz, posiblemente sea:

 package sample; public class Delete { int i; int h=0; int n=10; int[] a; public Delete() { a = new int[10]; a[0]=-1; a[1]=-1; a[2]=-1; a[3]=10; a[4]=20; a[5]=30; a[6]=40; a[7]=50; a[8]=60; a[9]=70; } public void shrinkArray() { for(i=0;i0) { for(i=h;i 

Por favor comenta por cualquier error !!

Sin uso de cualquier función predefinida y eficiente: — >>

 public static void Delete(int d , int[] array ) { Scanner in = new Scanner (System.in); int i , size = array.length; System.out.println("ENTER THE VALUE TO DELETE? "); d = in.nextInt(); for ( i=0;i< size;i++) { if (array[i] == d) { int[] arr3 =new int[size-1]; int[] arr4 = new int[i]; int[] arr5 = new int[size-i-1]; for (int a =0 ;a