2011-02-02 16 views
30

¿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 aumentar la capacidad si necesito agregar otro artículo?Eliminar elemento de la matriz y reducir la matriz

+0

es 'array' la estructura de datos requerida para su caso de uso? Parece que estás usando el martillo equivocado –

Respuesta

0

Las matrices tienen un tamaño fijo, no puede cambiar su tamaño después de crearlas. Puede quitar un elemento existente estableciéndolo en null:

objects[4] = null; 

Pero usted no será capaz de eliminar toda esa ranura de la matriz y reducir su tamaño 1.

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

+0

¿Puedo crear una nueva matriz sin el elemento que quiero eliminar? – Joe

+0

@Joe: Esa también es una opción posible; Eche un vistazo a las otras respuestas. – BoltClock

15

No se puede cambiar el tamaño de la matriz, por sí mismo, pero puede crear una nueva matriz y eficiente copiar los elementos de la matriz de edad a la nueva matriz mediante alguna función de utilidad como esto:

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 Un mejor enfoque, sin embargo, sería usar 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.

+1

Hay un error en este código, que hará que siempre arroje un NPE. He editado la respuesta con la corrección. – Joel

+0

La primera llamada al método System.arraycopy no es necesaria. – Stuart

1
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 manera de reducir el tamaño de un array después de su creación, pero se puede copiar el contenido a otra matriz de un tamaño menor.

+0

¿Qué pasa si solo quiero ignorar el último byte de una matriz de 640 bytes ... – aProgrammer

+0

Entonces su instanciación sería 'object [] new array = new object [oldarray.Length-2];' el ciclo for se ocupa de los incrementos – Mike

+0

Quiero decir ... ¿Necesitamos crear una nueva matriz incluso si solo queremos ignorar un byte ... ¿No podemos reducir la matriz? – aProgrammer

22

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

  • Si quiere "crecer" o "reducir" una matriz existente, tiene que asignar una nueva matriz del tamaño apropiado y copiar los elementos de la matriz; p.ej. usando 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 reemplazándolos por null), debe asignar una nueva matriz más pequeña y copiar los elementos que desee para retener.

hay alternativas en forma de bibliotecas 3 ª parte (por ejemplo Apache Commons ArrayUtils), pero puede que desee considerar si vale la pena agregar una dependencia de la biblioteca simplemente por el bien de un método que podría implementarse con 5-10 líneas de código.


Es mejor (es decir, más simple ... y en muchos casos, más eficientes) utilizar una clase List lugar de una matriz. Esto se encargará (al menos) de aumentar 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 utiliza 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 usando el método trimToSize(); p.ej.

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

1 - Me dicen que es "más eficiente en muchos casos" porque ArrayList utiliza una simple estrategia de "doble del tamaño" cuando se necesita para crecer la matriz de soporte. 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.

0

sin necesidad de 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.

+0

Esto está incompleto. Y realmente no responde la pregunta. –

11

El uso de ArrayUtils.removeElement(Object[],Object) de org.apache.commons.lang es, con mucho, 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); 
+2

Esto realmente no cambia el tamaño de la matriz. Crea uno nuevo. Pero no hay otra forma, porque el tamaño de las matrices no se puede cambiar. – MrSmith42

+0

es una buena opción. – Simmant

2

He creado esta función o clase. Soy un poco nuevo, pero mi amigo necesitaba esto también por lo que creó esta:

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; 
    } 
} 

Desde su revelant bastante, pensé que iba a publicar aquí.

2

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 convierte en 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, un ahora apuntará a una nueva matriz que contiene sólo 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).

+0

Para mí, la solución de trabajo mejor y más corta para truncar una matriz. ¡Gracias! – Ruwen

-1

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 es:

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;i<n;i++) 
      { 
       if(a[i]==-1) 
        h++; 
       else 
        break; 
      } 
      while(h>0) 
       { 
        for(i=h;i<n;i++) 
        { 
         a[i-1]=a[i]; 
        } 
        h--; 
        n--; 
       } 
      System.out.println(n); 
    } 
    public void display() 
    { 
     for(i=0;i<n;i++) 
     { 
      System.out.println(a[i]); 
     } 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Delete obj = new Delete(); 
     obj.shrinkArray(); 
     obj.display(); 

    } 

} 

¡Comente cualquier error!

+0

Esto no cambia el tamaño de la matriz según lo solicitado. –

-2

Ningún uso de cualquier función predefinida, así como 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<i;a++) 
            { 
             arr4[a]=array[a]; 
             arr3[a] = arr4[a]; 
            } 
            for (int a =i ;a<size-1;a++) 
            { 
             arr5[a-i] = array[a+1]; 
             arr3[a] = arr5[a-i]; 

            } 


       System.out.println(Arrays.toString(arr3)); 

         } 
       else System.out.println("************");  


     } 

} 
+0

Esto no cambia el tamaño de la matriz según lo solicitado. –

Cuestiones relacionadas