ArrayList Objekt über ID abrufen

8

Angenommen, ich habe ein ArrayList<Account> meiner benutzerdefinierten Objekte, was sehr einfach ist. Zum Beispiel:

%Vor%

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.

    
Madhur Ahuja 04.11.2013, 18:19
quelle

6 Antworten

12

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 .

    
Amir Afghani 04.11.2013, 18:22
quelle
2

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:

%Vor%

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.

    
Vae 04.11.2013 18:26
quelle
1

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.

    
SpacePrez 04.11.2013 18:26
quelle
1

Sie müssen die Karte zum Beispiel verwenden:

%Vor%     
FelasDroid 04.11.2013 18:27
quelle
1

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.

  • Einfügen von Objekten: map.put(id, account) anstelle von list.add(account)
  • Objekte abrufen: 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:

%Vor%     
Guillaume Poussel 04.11.2013 18:27
quelle
1

Ein besserer Weg wäre eine Map.

In Ihrem Fall könnten Sie es folgendermaßen implementieren:

%Vor%

Sie können die Methode "get" verwenden, um das entsprechende Kontoobjekt abzurufen.

%Vor%     
Raghu 04.11.2013 18:29
quelle

Tags und Links