Kein Betrüger. In der vorherigen Frage geht es darum, Elemente nach Wert zu entfernen. Hier geht es darum, ein Element nach Index zu entfernen.
James.garriss
Antworten:
154
Die Größe von Arrays in Java kann nicht geändert werden. Technisch gesehen können Sie also keine Elemente aus dem Array entfernen.
Eine Möglichkeit, das Entfernen eines Elements aus dem Array zu simulieren, besteht darin, ein neues, kleineres Array zu erstellen und dann alle Elemente aus dem ursprünglichen Array in das neue, kleinere Array zu kopieren.
Allerdings würde ich nicht das obige Verfahren vorschlagen. Sie sollten wirklich eine verwenden List<String>. Mit Listen können Sie Elemente zu jedem Index hinzufügen und daraus entfernen. Das würde ungefähr so aussehen:
List<String> list =newArrayList<String>();// or LinkedList<String>();
list.add("Stuff");// add lots of stuff
list.remove(0);// removes the first item
Es ist wichtig zu beachten, dass das Entfernen des ersten Elements von an ArrayListO (n) ist.
Matthew Flaschen
1
@Matt, für ein Array und die Liste. Der Code ist jedoch für die Liste viel einfacher.
jjnguy
16
Für ein Array und ein ArrayList, aber nicht für LinkedList.
Matthew Flaschen
4
Auf) ? gut .. in einem C-Array? Um das Faustelement zu entfernen, können Sie einfach den Zeiger O (1)
Hernán Eche
2
Für diejenigen, die Java für Android wie ich verwenden, Arrays.copyOfRange()ist für API9 +
Sdghasemi
14
Der einfachste Weg ist wahrscheinlich der folgende: Sie müssen im Grunde ein neues Array erstellen, das ein Element kleiner ist, und dann die Elemente, die Sie behalten möchten, an die richtigen Positionen kopieren.
int n=oldArray.length-1;String[] newArray=newString[n];System.arraycopy(oldArray,1,newArray,0,n);
Beachten Sie, dass wenn Sie diese Art von Operation häufig ausführen, dies ein Zeichen dafür sein kann, dass Sie tatsächlich eine andere Art von Datenstruktur verwenden sollten, z. B. eine verknüpfte Liste. Das Erstellen eines neuen Arrays ist jedes Mal eine O (n) -Operation, die teuer werden kann, wenn Ihr Array groß ist. Eine verknüpfte Liste würde Ihnen O (1) das Entfernen des ersten Elements geben.
Eine alternative Idee besteht darin, das erste Element überhaupt nicht zu entfernen, sondern nur eine Ganzzahl zu erhöhen, die auf den ersten verwendeten Index verweist. Benutzer des Arrays müssen diesen Offset berücksichtigen, dies kann jedoch ein effizienter Ansatz sein. Die Java String-Klasse verwendet diese Methode tatsächlich intern beim Erstellen von Teilzeichenfolgen.
Dies ist technisch nicht der einfachste Weg. Arrays.copyOfRange()ist.
jjnguy
4
Da er Java6 verwendet, kann er die kompakteren Arrays.copyOfRange
Thilo
1
@ Justin - sicher, aber nur, wenn Sie auf Java 1.6 oder höher
abzielen
1
wahr. Es ist nicht immer anwendbar.
jjnguy
6
Der Titel der Frage macht deutlich, dass das OP an Antworten für Java 1.6 und höher interessiert ist .
Stephen C
5
Sie können es überhaupt nicht tun, geschweige denn schnell. Arrays in Java haben eine feste Größe. Zwei Dinge, die Sie tun könnten, sind:
Verschieben Sie jedes Element um eins nach oben und setzen Sie das letzte Element auf null.
Erstellen Sie ein neues Array und kopieren Sie es.
Sie können System.arraycopyfür beide verwenden. Beide sind O (n), da sie alle bis auf 1 Element kopieren.
Wenn Sie das erste Element häufig entfernen, sollten Sie LinkedListstattdessen verwenden. Sie können das LinkedList.remove, was über die QueueBenutzeroberfläche erfolgt, bequem verwenden. Mit LinkedListist das Entfernen des ersten Elements O (1). In der Tat ist das Entfernen eines Elements O (1), sobald Sie eine ListIteratorPosition erreicht haben. Der Zugriff auf ein beliebiges Element über den Index ist jedoch O (n).
Behalten Sie einen Index des ersten "lebenden" Elements des Arrays. Das Entfernen (vorgeben, es zu entfernen) des ersten Elements wird dann zu einer O(1)zeitkomplexen Operation.
Bitte, jemand mit ausreichendem Ruf hat diese Antwort abgelehnt - es ist genau das, was es sagt - hässlich! Keine Absicht, unhöflich zu sein, aber im Interesse der Codierbarkeit bitte nicht so etwas posten!
Hack5
Wenn Sie bereits Arrays verwenden, ist es besser, Arrays.copyOfRange
Bishal Gautam
Er fragte nach dem besten Weg.
Sapphire_Brick
Löschen Sie es und sehen Sie, wie viel Ansehen Sie gewinnen werden.
Antworten:
Die Größe von Arrays in Java kann nicht geändert werden. Technisch gesehen können Sie also keine Elemente aus dem Array entfernen.
Eine Möglichkeit, das Entfernen eines Elements aus dem Array zu simulieren, besteht darin, ein neues, kleineres Array zu erstellen und dann alle Elemente aus dem ursprünglichen Array in das neue, kleinere Array zu kopieren.
Allerdings würde ich nicht das obige Verfahren vorschlagen. Sie sollten wirklich eine verwenden
List<String>
. Mit Listen können Sie Elemente zu jedem Index hinzufügen und daraus entfernen. Das würde ungefähr so aussehen:quelle
ArrayList
O (n) ist.ArrayList
, aber nicht fürLinkedList
.Arrays.copyOfRange()
ist für API9 +Der einfachste Weg ist wahrscheinlich der folgende: Sie müssen im Grunde ein neues Array erstellen, das ein Element kleiner ist, und dann die Elemente, die Sie behalten möchten, an die richtigen Positionen kopieren.
Beachten Sie, dass wenn Sie diese Art von Operation häufig ausführen, dies ein Zeichen dafür sein kann, dass Sie tatsächlich eine andere Art von Datenstruktur verwenden sollten, z. B. eine verknüpfte Liste. Das Erstellen eines neuen Arrays ist jedes Mal eine O (n) -Operation, die teuer werden kann, wenn Ihr Array groß ist. Eine verknüpfte Liste würde Ihnen O (1) das Entfernen des ersten Elements geben.
Eine alternative Idee besteht darin, das erste Element überhaupt nicht zu entfernen, sondern nur eine Ganzzahl zu erhöhen, die auf den ersten verwendeten Index verweist. Benutzer des Arrays müssen diesen Offset berücksichtigen, dies kann jedoch ein effizienter Ansatz sein. Die Java String-Klasse verwendet diese Methode tatsächlich intern beim Erstellen von Teilzeichenfolgen.
quelle
Arrays.copyOfRange()
ist.Sie können es überhaupt nicht tun, geschweige denn schnell. Arrays in Java haben eine feste Größe. Zwei Dinge, die Sie tun könnten, sind:
Sie können
System.arraycopy
für beide verwenden. Beide sind O (n), da sie alle bis auf 1 Element kopieren.Wenn Sie das erste Element häufig entfernen, sollten Sie
LinkedList
stattdessen verwenden. Sie können dasLinkedList.remove
, was über dieQueue
Benutzeroberfläche erfolgt, bequem verwenden. MitLinkedList
ist das Entfernen des ersten Elements O (1). In der Tat ist das Entfernen eines Elements O (1), sobald Sie eineListIterator
Position erreicht haben. Der Zugriff auf ein beliebiges Element über den Index ist jedoch O (n).quelle
Behalten Sie einen Index des ersten "lebenden" Elements des Arrays. Das Entfernen (vorgeben, es zu entfernen) des ersten Elements wird dann zu einer
O(1)
zeitkomplexen Operation.quelle
Zusammenfassend lässt sich sagen, dass die Methode der schnellen verknüpften Liste:
quelle
Eine alternative hässliche Methode:
quelle