Angenommen, ich habe ein ArrayList<Account>
meiner benutzerdefinierten Objekte, was sehr einfach ist. Zum Beispiel:
Ich möchte das bestimmte Account
-Objekt basierend auf einem Id
-Parameter in vielen Teilen meiner Anwendung abrufen. Was wäre der beste Weg dazu?
Ich dachte daran, ArrayList
zu erweitern, aber ich bin mir sicher, dass es einen besseren Weg geben muss.
Es klingt wie das, was Sie wirklich verwenden möchten, ist ein Map
, mit dem Sie Werte basierend auf einem Schlüssel abrufen können. Wenn Sie bei ArrayList
bleiben, besteht Ihre einzige Option darin, die gesamte Liste zu durchlaufen und nach dem Objekt zu suchen.
Etwas wie:
%Vor%versus
%Vor% Diese Art von Operation ist O(1)
in Map
, vs O(n)
in List
.
Ich habe darüber nachgedacht, ArrayList zu erweitern, aber ich bin mir sicher, dass es da sein muss besserer Weg.
Im Allgemeinen ist dies ein schlechtes Design. Lesen Sie Effektives Java Punkt 16, um besser zu verstehen, warum - oder lesen Sie das article .
Unter der Annahme, dass es sich um eine ungeordnete Liste handelt, müssen Sie über die Liste iterieren und jedes Objekt überprüfen.
%Vor% Es gibt auch die andere for
-Syntax:
Sie können diese Schleife in eine Hilfsmethode einfügen, die ein Account
verwendet und mit jedem Element vergleicht.
Für sortierte Listen haben Sie effizientere Suchoptionen, aber Sie müssen eine Suche implementieren, egal was passiert.
ArrayList sortiert die enthaltenen Elemente nicht. Wenn Sie in einer ArrayList nach einem einzelnen Element suchen möchten, müssen Sie die Liste durchlaufen und jeden einzelnen mit dem Wert vergleichen, den Sie suchen.
%Vor%Alternativ können Sie eine intelligentere Datenstruktur verwenden, die Informationen zu den gespeicherten Daten sortiert und aufbewahrt.
Sie sollten die Map-Schnittstelle, insbesondere die HashMap-Implementierung, recherchieren. Auf diese Weise können Sie jedes Element in einer Reihenfolge speichern, die an einen bestimmten Schlüssel gebunden ist. Sie können also jedes Ihrer Objekte in einer HashMap mit der ID als Schlüssel platzieren und dann können Sie die HashMap direkt fragen, ob sie ein Objekt mit einem bestimmten Schlüssel hat oder nicht.
Das Erweitern von ArrayList
ist fast nie eine gute Lösung für Ihr Problem. Dies ist eine Basis-Java-Implementierung von List
, mit der Sie Objekte in einer bestimmten Reihenfolge speichern und nach ihrem Index abrufen können.
Wenn Sie Elemente mit einem eindeutigen Bezeichner indizieren möchten, sehen Sie sich Map
und seine Implementierung HashMap
.
Es könnte Ihnen helfen, Ihr Problem zu lösen, indem Sie Map<Integer, Account>
verwenden.
map.put(id, account)
anstelle von list.add(account)
map.get(id)
Dies wird die schnellste Implementierung sein. Wenn Sie dies jedoch nicht ändern können, können Sie immer noch Ihre ArrayList
durchlaufen und das richtige Konto finden:
Tags und Links java collections arraylist