Prädikat Suche in Java
Nicht ganz sicher, wie das Wort zu dieser Frage.
Ich Frage mich, ob es eine Methode gibt, um zu überprüfen, bestimmte Teile einer benutzerdefinierten java-Klasse, um zu sehen, wenn es passt, die bestimmte Kriterien erfüllen.
Wie diese
public Name(String forename, String middlename, String surname)
Dann, wenn Sie ein array von Instanzen dieser Klasse erstellt werden sagen,
Name[] applicants = new Name[4];
applicants[0] = new Name("john","bob", "rush");
applicants[1] = new Name("joe","bob", "rushden");
applicants[2] = new Name("jack","bob", "rushden");
applicants[3] = new Name("jake","bob", "rushden");
Ist es möglich, eine Suche über die Instanzen der Klasse person mit
midddlename.equals("bob") && surname.equals("rush")
Ich bin nicht wirklich auf der Suche für eine Lösung, die if(surname.equals("bob")) then else
usw
Aber mehr über eine eingebaute java-Klasse, das ermöglicht die schnelle Suche über das array.
die Geschwindigkeit dieser ist sehr wichtig.
- Vorzeitige Optimierung?
- Sie sollten keine Arrays verwenden, wenn Sie zu haben, sind die Listen eine bessere Lösung in 99.99999% aller Fälle.
- Warum ist es ein "Java-Objekt-Frage"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nicht errichtet in der Unterstützung, aber Apache-Sammlungen und Google Collections beide bieten Prädikat Unterstützung über die Sammlungen.
Können Sie finden diese Frage und deren Antworten hilfreich sind. Das gleiche mit dieser developer.com Artikel.
z.B. Mit Google Collections:
Suche durch ein array und "speed ist sehr wichtig," nicht richtig zusammen. Es sei denn, wenn das array sehr klein sein, dann ist die Suche durch ein array wird nie schnell sein. Dies ist das äquivalent von einem full table scan in einer Datenbank, performance-egal, wie du über Sie gehen schlecht. Der Schlüssel zur Entdeckung von Sachen, die schnell ist, um eine indizierte Struktur. Können Sie noch ein array, wenn Sie unbedingt brauchen, aber die Suche sollte durchgeführt werden, indem eine andere Datenstruktur. Schauen Sie sich eine Hash-oder Baum-basierten collection seit Sie organisieren die Daten in einer Weise, dass es sehr schnell abrufen zu können. TreeSet, TreeMap, HashSet, HashMap, etc. - Hashes-index-Daten auf einen Hash-Schlüssel, die Bäume sind ähnlich, aber auch die Speicherung Ihrer Daten in einer sortierten Reihenfolge.
Wenn Sie brauchen, um die Suche basierend auf den Objekt-Gleichheit über array check
apache common ArrayUtils
, Sie haben im Grunde überschreiben Ihre equals und hascode für name-Objekt und verwenden Sie es, aber wenn Sie möchten, verwenden Sie benutzerdefinierte Suchkriterien, ich denke, Sie implementieren müssen, um Ihren eigenen Weg und es gibt keinen eingebauten java-language-supportNutzung einer in-memory Datenbank wie Apache Derby oder hsqldb. Profitieren Sie von JDBC, JPA oder Hibernate, die können alle machen was Sie wollen.
Profil code. Dann optimieren.
Den schnelleren Weg, die ich denken kann, ist die Erstellung einer Datenstruktur, die Spiegel dieser Objekte, Eigenschaft, Werte und halten Sie die internen index für jeden Wert hat.
Wenn ein Wert gesucht wird, diese internen Daten-Struktur zurück, die den index unter Verwendung der binären Suche.
Die einzige Voraussetzung ist, Ihr Objekt muss sich registrieren und aktualisieren Sie diese Struktur.
Etwas wie die folgenden imaginären UML/Python wie code:
Oops
Ich hoffe das ist verständlich.
Der Punkt ist, wenn Sie wirklich was zu haben, das ist wirklich schnell, Sie haben zu halten die Indizes von Eigentum
Zum Beispiel, wenn Sie das folgende array:
Hätten Sie die Positionen:
Und erhalten Sie zwei ( in diesem Fall ) separate Felder, welche nach der Sortierung wäre:
und
Wenn Sie suchen für ein bestimmtes Attribut, nehmen Sie das entsprechende array, zum Beispiel, wenn Sie wan zu suchen, die den Nachnamen "Reyes" Sie nehmen werde, "lastName" array
Und führen binarysearch-Methode auf, die es für "Reyes" die Rückkehr das element an position 2, was wiederum die Rendite des index = 1 whih ist die position "Oscar" hat auf das Originale array.
Damit sollte Dinge, die unter O(log n)
Blick auf ParallelArray Klasse, es erfüllt deine Anforderungen, aber Sie müssen lernen, ein bisschen die funktionale Programmierung Konzepte, die es effizient zu nutzen.
Die Klasse kommt nicht mit JDK 6, aber vielleicht kommen mit JDK 7 (unter Diskussion). Mittlerweile können Sie es als eine Bibliothek - download der JSR166y Paket aus:
http://gee.cs.oswego.edu/dl/concurrency-interest/
In dieser Anleitung finden Sie eine detaillierte Erklärung:
http://www.ibm.com/developerworks/java/library/j-jtp03048.html
Ist es auch klingen mag kompliziert, und es ist (wenn Sie arew nur Graben im high-performance multi-Thread-algorithmen). Es ist ein Groovy-Projekt, welches versucht, wickeln Sie ein mehr-Benutzer-freundliche API um Parallel Arrays, so möchten Sie vielleicht, um ttake Sie einen Blick auf uns: http://gpars.codehaus.org/ , http://gpars.codehaus.org/Parallelizer
Java 8 lambda-Ausdrücke Hinzugefügt und das stream-API, also die Unterstützung ist eingebaut jetzt.
Es gibt viele Möglichkeiten hier. Sie können den ersten Namen entsprechend durch den Wechsel
.findAny()
zu.findFirst()
oder führen Sie die Suche durch parallel einsetzen.parallel()
nach.stream(applicants)
zum Beispiel.