Wie entferne ich Objekte aus einem Array in Java?
Gegeben ein array von n Objekte, lassen Sie uns sagen, es ist ein array von stringsund es hat folgende Werte:
foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";
Was muss ich tun um Sie zu löschen/entfernen Sie alle strings/Objekte gleich "a" in das array?
InformationsquelleAutor der Frage ramayac | 2008-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
[Wenn Sie möchten, einige ready-to-use code, scrollen Sie bitte auf meine "Edit3" (nach dem Schnitt). Der rest ist hier für die Nachwelt.]
Fleisch aus Müllmann Idee:
Edit: ich bin jetzt mit
Arrays.asList
stattCollections.singleton
: singleton ist nur ein Beitrag, in der Erwägung, dass dieasList
Ansatz ermöglicht das hinzufügen von anderen Zeichenfolgen zu filtern, später:Arrays.asList("a", "b", "c")
.Edit2: Der obige Ansatz bleibt der gleiche Arrays (also array ist immer noch die gleiche Länge); das element nach dem letzten null gesetzt wird. Wenn Sie möchten, eine neue array-Größe genau so, wie erforderlich, verwenden Sie diese statt:
Edit3: Wenn du diesen code auf einer häufigen basis in der gleichen Klasse, möchten Sie vielleicht zu prüfen, indem diese auf Ihre Klasse:
Dann die Funktion wird:
Diese wird dann stop littering Ihre heap mit nutzlosen, leeren string-arrays, die sonst
new
ed jedes mal, wenn Ihre Funktion genannt wird.cynicalman s Vorschlag (siehe Kommentare), auch helfen wird, mit dem heap littering und für fairness sollte ich es erwähnen:
Ziehe ich meine Vorgehensweise, denn es kann einfacher sein, um die explizite Größe, die falsch sind (z.B., ruft
size()
auf die falsche Liste).InformationsquelleAutor der Antwort Chris Jester-Young
Alternative in Java 8:
InformationsquelleAutor der Antwort Vitalii Fedorenko
Machen
List
aus dem array mitArrays.asList()
und rufen Sieremove()
auf alle entsprechenden Elemente. Dann rufen SietoArray()
auf der 'Liste', um zurück in ein array wieder.Nicht sehr performant, aber wenn Sie Kapseln es richtig ist, können Sie immer tun, etwas schneller später.
InformationsquelleAutor der Antwort Dustman
Können Sie immer tun:
InformationsquelleAutor der Antwort
Können Sie externe Bibliothek:
Ist es im Projekt Apache Commons Lang http://commons.apache.org/lang/
InformationsquelleAutor der Antwort bugs_
Siehe code unten
InformationsquelleAutor der Antwort hesam
Wenn Sie brauchen, um zu entfernen mehrerer Elemente aus array ohne Konvertierung zu
List
noch die Schaffung zusätzlicher array ist, kann es in O(n) nicht abhängig von der Anzahl der Elemente zu entfernen.Hier
a
initial arrayint... r
sind verschiedene bestellt indices (Positionen) der Elemente zu entfernen:Kleinen Test:
In Ihrer Aufgabe, können Sie die ersten scan-array zu sammeln, Positionen "a", dann rufen Sie
removeItems()
.InformationsquelleAutor der Antwort Alex Salauyou
Etwas über die Liste machen, dann entfernen Sie anschließend wieder in ein array scheint mir falsch. Noch nicht getestet, aber ich denke die folgenden werden besser. Ja, ich bin wahrscheinlich übermäßig pre-Optimierung.
InformationsquelleAutor der Antwort shsteimer
Ich begreife, dass dies ein sehr Alter post, aber einige der Antworten, die hier mir geholfen, hier also mein tuppence' ha ' Penny Wert!
Kämpfte ich immer diese Arbeit für eine Weile, bevor twigging, dass das array, dass ich Schreibe wieder in benötigt, um in der Größe verändert werden, es sei denn, die änderungen der
ArrayList
verlassen der Liste Größe unverändert.Wenn die
ArrayList
die Sie gerade Bearbeiten, endet mit mehr oder weniger Elementen, als es begann mit der LinieList.toArray()
zu einer Ausnahme führen, so müssen Sie etwas wieList.toArray(new String[] {})
oderList.toArray(new String[0])
in Reihenfolge zu erstellen ein array mit den neuen (richtigen) Größe.Selbstverständlich klingt, nun, ich weiß es. Nicht so offensichtlich für einen Android/Java-Neuling, die die Auseinandersetzung mit neuen und ungewohnten code-Konstrukte und nicht offensichtlich aus einigen der früheren Beiträge hier, so wollte es genauso machen, dieser Punkt ist wirklich klar, für jemand anderen kratzen Ihre Köpfe für Stunden, wie ich es war!
InformationsquelleAutor der Antwort DDSports
EDIT:
Den Punkt mit der null-Werte im array gelöscht wurde. Sorry für meine Kommentare.
Original:
Ehm... die Linie
ersetzt alle Lücken im array, wobei das entfernte element wurde mit null. Dies könnte gefährlichdenn die Elemente sind entfernt, aber die Länge des Arrays bleibt gleich!
Wenn Sie dies vermeiden wollen, verwenden Sie ein neues Array als parameter für die toArray(). Wenn Sie nicht möchten, zu verwenden, removeAll, eine Reihe wäre eine alternative:
Gibt:
Wo, wie die aktuelle akzeptierte Antwort von Chris Yester Jungen Ausgänge:
mit dem code
ohne null-Werte hinter sich gelassen.
InformationsquelleAutor der Antwort GHad
Meinen kleinen Beitrag zu diesem problem.
}
InformationsquelleAutor der Antwort Andre
Gibt es eine Menge Antworten hier-das problem, wie ich es sehe, ist, dass Sie nicht sagen, WARUM Sie ein array statt einer Sammlung, so lassen Sie mich vorschlagen, ein paar Gründe und welche Lösungen gelten würde (die Meisten Lösungen haben wir bereits beantwortet, die in anderen Fragen hier, damit ich nicht zu sehr ins detail gehen):
Grund: Sie wussten nicht, die Sammlung-Paket existiert nicht mehr oder noch nicht trauen es
Lösung: Verwenden Sie eine Sammlung.
Wenn Sie planen, das hinzufügen/löschen von der Mitte, verwenden Sie eine LinkedList. Wenn Sie wirklich besorgt über die Größe oder oft index rechts in der Mitte der Sammlung, Verwendung einer ArrayList. Beide sollten haben, delete-Operationen.
Grund: Sie sind besorgt über die Größe, oder wollen die Kontrolle über memory allocation
Lösung: Verwenden Sie eine ArrayList mit einer bestimmten ersten Größe.
Einer ArrayList ist einfach ein array, erweitern sich, es muss aber nicht immer so tun müssen. Es wird sehr gut über das hinzufügen/entfernen von Elementen, aber wieder, wenn Sie einfügen/entfernen einer MENGE aus der Mitte, verwenden Sie eine LinkedList.
Grund: Sie haben ein array kommen und ein array ausgehen -, so dass Sie bedienen möchten, auf eine Reihe
Lösung: Konvertieren Sie es zu einer ArrayList löschen Sie das Element aus und konvertieren es zurück
Grund: Sie denken, Sie können schreiben besseren code, wenn Sie es selbst tun
Lösung: Sie können nicht, verwenden Sie ein Array oder verkettete Liste.
Grund: dies ist eine klassenzuordnung, und Sie sind nicht erlaubt, oder Sie haben keinen Zugriff auf die Sammlung von apis für einige Grund
Annahme: Sie brauchen das neue array auf die richtige "Größe"
Lösung:
Scannen Sie den array für die passenden Artikel, und zählen Sie Sie. Erstellen Sie ein neues array mit der richtigen Größe (die original-Größe - Anzahl der matches). verwenden Sie System.arraycopy immer wieder zu kopieren, jede Gruppe von Elementen, die Sie behalten möchten, in das neue Array. Wenn dies eine klassenzuordnung, und Sie nicht verwenden können, System.arraycopy, kopieren Sie einfach Sie ein zu einer Zeit, die von hand in einer Schleife, aber nicht immer tun, diese in der Produktion-Codes, da es viel langsamer. (Diese Lösungen sind sowohl detaillierte als auch in anderen Antworten)
Grund: Sie müssen führen Sie eine bare-metal
Annahme: Sie MÜSSEN nicht reservieren Speicherplatz unnötig oder zu lange dauern
Annahme: Sie verfolgen die Größe verwendet, die in das array (Länge) separat, weil sonst müsste man reservieren Sie Ihr array löscht/einfügt.
Beispiel dafür, warum Sie dies möglicherweise tun möchten: ein einzelnes array von primitives (sagen wir int-Werte) einen beträchtlichen Teil Ihres ram-wie 50%! Eine ArrayList zwingen würde, diese in eine Liste von Zeigern auf Integer-Objekte, die ein paar mal die Menge an Arbeitsspeicher.
Lösung: Iteration über das array und wenn Sie finden, ein element zu entfernen (nennen wir es element n), verwenden Sie System.arraycopy, kopieren Sie den Schwanz des Arrays über den "gelöscht" - element (Quelle und Ziel sind die gleichen array) - es ist smart genug, um die Kopie in die richtige Richtung, damit der Speicher nicht überschrieben selbst:
Wahrscheinlich wollen Sie klüger sein als diese, wenn Sie das löschen von mehr als einem element zu einem Zeitpunkt. Sie würde nur der Bereich zwischen einem "match" und die nächste, anstatt den gesamten Schwanz und wie immer, vermeiden Sie das verschieben jedes Stück zweimal.
In diesem letzten Fall, müssen Sie unbedingt die Arbeit selbst, und mit System.arraycopy ist wirklich der einzige Weg, es zu tun, da es die beste zu wählen möglicherweise Weg von Speicher für Ihren computer-Architektur-es sollten viele mal schneller als jeder code, den Sie vernünftigerweise selbst schreiben.
InformationsquelleAutor der Antwort Bill K
Es hängt davon ab, was meinen Sie mit "entfernen"? Ein array ist eine Feste Größe konstruieren - Sie können nicht ändern die Anzahl der Elemente in es. So können Sie entweder a) erstellen Sie eine neue, kürzere, array ohne Elemente, die Sie nicht wollen oder b) ordnen Sie die Einträge, die Sie nicht wollen, zu etwas, das darauf hinweist, dass Sie "leer" - status; in der Regel null, wenn Sie nicht arbeiten mit regelgeometrien.
Im ersten Fall erstellen Sie eine Liste aus dem array entfernen Sie die Elemente, und erstellen Sie ein neues array aus der Liste. Wenn Leistung wichtig ist, die Iteration über das array zuweisen, Elemente, die nicht entfernt werden, um eine Liste, und erstellen Sie dann einen neuen array aus der Liste. Im zweiten Fall gehen Sie einfach durch null zuweisen der array-Einträge.
InformationsquelleAutor der Antwort DJClayworth
Arrgh, ich kann nicht den code zu zeigen, richtig. Sorry, ich habe es funktioniert. Sorry nochmal, ich glaube nicht, ich lies die Frage richtig.
InformationsquelleAutor der Antwort AngelOfCake
Wird kopieren Sie alle Elemente, außer dem mit index i:
InformationsquelleAutor der Antwort PauLy
InformationsquelleAutor der Antwort Parameshwar
Verwenden:
InformationsquelleAutor der Antwort LOL
Null zuweisen, das array Standorten.
InformationsquelleAutor der Antwort alfinoba