Element aus Array löschen und Array verkleinern

Wie kann ich ein Element aus einem Array löschen und die Größe des Arrays dann auf die kleinere Größe ändern? Wie kann ich die Kapazität erhöhen, wenn ich einen weiteren Artikel hinzufügen muss?

Die Größe eines Java-Arrays ist bei der Zuweisung fest und kann nicht geändert werden.

  • Wenn Sie ein vorhandenes Array “wachsen” oder “verkleinern” möchten, müssen Sie ein neues Array der entsprechenden Größe zuweisen und die Array-Elemente kopieren. zB mit System.arraycopy(...) oder Arrays.copyOf(...) . Eine Kopierschleife funktioniert auch, obwohl es ein wenig klobig aussieht … IMO.

  • Wenn Sie ein Element oder Elemente aus einem Array “löschen” möchten (im eigentlichen Sinne … nicht nur durch null ersetzen), müssen Sie ein neues, kleineres Array zuweisen und über die Elemente kopieren, die Sie beibehalten möchten.

Es gibt Alternativen in Form von 3rd-Party-Bibliotheken (zB Apache Commons ArrayUtils ), aber Sie sollten überlegen, ob es sich lohnt, eine Bibliotheksabhängigkeit nur für eine Methode hinzuzufügen, die Sie selbst mit 5-10 Zeilen implementieren könnten Code.


Es ist besser (dh einfacher … und in vielen Fällen effizienter 1 ), eine List class anstelle eines Arrays zu verwenden. Dadurch wird (zumindest) der Backing-Speicher erweitert. Und es gibt Operationen, die dafür sorgen, dass Elemente überall in der Liste eingefügt und gelöscht werden.

Zum Beispiel verwendet die ArrayList class ein Array als Hintergrund und vergrößert das Array automatisch nach Bedarf. Es reduziert nicht automatisch die Größe des Hintergrund-Arrays, aber Sie können es mit der trimToSize() -Methode dazu veranlassen; z.B

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

1 – Ich sage, dass es in vielen Fällen “effizienter” ist, da ArrayList eine einfache “Double-Size” -Strategie verwendet, wenn das Backing-Array vergrößert werden muss. Dies bedeutet, dass, wenn die Liste durch wiederholtes Anhängen vergrößert wird, jedes Element im Durchschnitt um eine zusätzliche Zeit kopiert wird. Wenn Sie dies mit einem Array machen, würden Sie am Ende jedes Array-Element im Durchschnitt N / 2-mal kopieren.

Sie können die Größe des Arrays an sich nicht ändern, aber Sie können ein neues Array erstellen und die Elemente effizient vom alten Array in das neue Array kopieren, indem Sie eine der folgenden functionen verwenden:

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

Ein besserer Ansatz wäre jedoch, eine ArrayList (oder eine ähnliche List-Struktur) zu verwenden, um Ihre Daten zu speichern und dann ihre Methoden zu verwenden, um Elemente nach Bedarf zu entfernen.

Die Verwendung von ArrayUtils.removeElement(Object[],Object) aus org.apache.commons.lang ist bei weitem der einfachste Weg, dies zu tun.

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

Da ein Array eine feste Größe hat, die bei der Erstellung zugewiesen wird, besteht Ihre einzige Option darin, ein neues Array ohne das Element zu erstellen, das Sie entfernen möchten.

Wenn das Element, das Sie entfernen möchten, das letzte Array-Element ist, kann dies einfach mit Arrays.copy implementiert werden:

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

Nach dem Ausführen des obigen Codes zeigt a nun auf ein neues Array, das nur 1, 2 enthält.

Andernfalls, wenn das Element, das Sie löschen möchten, nicht das letzte ist, müssen Sie ein neues Array mit der Größe 1 erstellen und alle Elemente mit Ausnahme desjenigen, das Sie löschen möchten, kopieren.

Der obige Ansatz ist nicht effizient. Wenn Sie eine veränderbare Liste von Elementen im Speicher verwalten müssen, verwenden Sie besser eine Liste. Speziell LinkedList wird ein Objekt aus der Liste in O(1) entfernen (das schnellste theoretisch möglich).

Ich habe diese function oder class erstellt. Ich bin irgendwie neu, aber mein Freund brauchte das auch, also habe ich Folgendes erstellt:

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

Da ich ein hübscher Offenbarer war, dachte ich, ich würde es hier veröffentlichen.

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

Es gibt keine Möglichkeit, ein Array nach der Erstellung zu verkleinern, aber Sie können den Inhalt in ein anderes Array geringerer Größe kopieren.

Arrays sind in der Größe festgelegt. Sie können die Größe der Arrays nach dem Erstellen nicht ändern. Sie können ein vorhandenes Element entfernen, indem Sie es auf null :

 objects[4] = null; 

Sie werden jedoch nicht in der Lage sein, den gesamten Slot aus dem Array zu löschen und seine Größe um 1 zu verringern.

Wenn Sie ein Array mit dynamischer Größe benötigen, können Sie eine ArrayList . Mit ihm können Sie Objekte add() und remove() , und es wird wachsen und verkleinern wie nötig.

Ohne die System.arraycopy-Methode zu verwenden, können Sie ein Element aus einem Array mit den folgenden Elementen löschen

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

Dabei ist 3 der Wert, den Sie entfernen möchten.

Sie können ein Array immer erweitern, indem Sie es beim Erstellen eines Arrays inkrementieren, oder Sie können die Größe nach dem Erstellen ändern, aber Elemente verkleinern oder löschen. Die alternative Lösung, ohne ein neues Array zu erstellen, ist möglicherweise:

 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 

Bitte kommentieren Sie für Fehler !!

Keine Verwendung einer vordefinierten function sowie effizient: — >>

 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