Suche ein Attribut innerhalb eines Vektors auf Java
Habe ich eine Vector
von Objekten, und haben auf der Suche nach innen für ein zufälliges Attribut dieser Objekte (Zum Beispiel, ein Plane
Klasse, ein Vector
mit Plane
; und ich habe manchmal suchen für destination
und andere pilotName
).
Ich weiß, ich kann die traverse Vector
mit einem Iterator
, aber ich hab am stecken wie ändere ich den Vergleich gemacht zwischen einem String und das Attribut auf das Objekt. Ich dachte, der Verwendung von switch
, aber eine andere Meinung wäre cool.
Update 1:
Den code, den ich geschrieben habe, ist so etwas wie dieses (Java-n00b-Alarm!):
public int search(String whatSearch, String query){
int place = -1;
boolean found = false;
for ( Iterator<Plane> iteraPlane = this.planes.iterator(); iteraPlane.hasNext() && found == false; ) {
Plane temp = (Plane) iteraPlane.next();
/* Here is where I have to search for one of many attributes (delimited by whatSearch */
}
return place;
}
Scheint, habe ich zu kleben, um die lineare Suche (und das ist ein Preis, den ich habe bezahlen zu können). Wie auch immer, ich dachte, wenn Java so etwas wie variable name der Variablen (Autsch!)
- können Sie nach dem code, die Sie versucht haben?
- Ich denke, das Schlüsselwort hier ist zufälliges Attribut. Ich habe eine Antwort unten, weil ich denke, Sie werden Fragen über die Implementierung eines Algorithmus, der sucht nach etwas, wo man nicht weiß, was gesucht wird an der Stelle der Codierung des Algorithmus. Wenn Sie nicht Fragen, dieses dann schlage ich vor, Sie verfeinern Sie Ihre Frage deutlicher machen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nehme ich an, dass Ihr problem ist, dass Sie möchten, um eine Methode, die sucht nach einem Ergebnis, basierend auf einige Eigenschaft der Sammlung geben. Java ist schwach, weil es am besten ausgedrückt in einer Sprache, die Verschlüsse hat. Was Sie brauchen, ist so etwas wie:
Werden und dann die search-Methode sieht wie folgt aus:
Dann jeder verwenden kann, diese general-purpose - such-Methode. Zum Beispiel, um nach einer Zahl in einem Vektor von
Integer
s:Aber man könnte implementieren Sie das Prädikat in irgendeiner Weise Sie wollen; für beliebige Suche
Verwenden
Collections.binarySearch
und bieten eineComparator
.EDIT: Dies setzt Voraus, dass die
Vector
sortiert ist. Ansonsten muss man eine lineare Suche.den
equals()
Methode ist die beste option. Für diese Wiederholungen, die Sie tun könnten, so etwas wie dieses:oder könnte man das überschreiben der
equals()
Methode innerhalbPlane
um zu sehen, ob die übergebenen String entspricht Ihrem Ziel (oder pilot). dies ermöglicht Ihnen die Nutzung derindexOf(Object)
undindexOf(Object, index)
Methoden aufVector
zurück, die Sie den index(N) des oder der Objekte(s). Sobald Sie das haben, könnten SieVector.get(index)
zurück zu Objekt für Sie.in
Plane.java
:dort ist mehr Arbeit zu sein getan mit dieser option, wie Sie benötigen, zu überschreiben
hashCode()
sowie (siehe Dokumentation).Siehe @oxbow_lakes oben-ich denke, das, was Sie wollen, nicht passieren eine
String
alswhatSearch
, es passieren ein kleines code-snippet, das weiß, wie man die Immobilie, die Sie interessiert sind in. Für eine weniger Allgemeine version:(By the way, wenn es dem index, den Sie interessiert sind, eher als die
Plane
selbst, ich würde nicht die Mühe mit einemIterator
-- nur verwenden Sie eine altmodischefor (int i = 0; i < planes.size(); i++)
Schleife, und, wenn Sie haben eine übereinstimmungreturn i
.)Nun, das knifflige bit ist hier, wenn das, was Sie suchen, ist wirklich identifiziert, die durch beliebige strings zur Laufzeit. Wenn das der Fall ist, kann ich schlage zwei alternativen:
plane.pilotName
,plane.destination
-- an alle. Nur eineMap<String, String>
(oder noch besser, eineMap<Field, String>
woField
ist einEnum
alle Felder) heißt so etwas wieplane.metadata
.PlaneMatcher
Instanzen, wie oben beschrieben.Zum Beispiel:
Oh, und Sie könnten versucht sein, verwenden Sie reflektion. Nicht. 🙂
Eine einfache Möglichkeit ist die übergabe einer Vergleichsfunktion, um Ihre Suche routine. Oder, wenn Sie brauchen mehr Geschwindigkeit, Generika verwendet werden.