Was ist der beste Weg, um das erste Element aus einem Array zu entfernen?

85

Ich habe string array ( String[]) und muss das erste Element entfernen. Wie kann ich das effizient machen?

NullVoxPopuli
quelle
Mögliches Duplikat von Wie entferne ich Objekte aus einem Array in Java?
McDowell
4
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.

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

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 = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
jjnguy
quelle
32
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=new String[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.

mikera
quelle
4
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:

  1. Verschieben Sie jedes Element um eins nach oben und setzen Sie das letzte Element auf null.
  2. 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).

Matthew Flaschen
quelle
2

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.

msw
quelle
0

Zusammenfassend lässt sich sagen, dass die Methode der schnellen verknüpften Liste:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
mjad-org
quelle
-8

Eine alternative hässliche Methode:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
Emil
quelle
2
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.
Sapphire_Brick