Vielleicht gibt es einen Namen für das, was ich will, aber ich weiß es nicht. Ich brauche etwas Ähnliches wie LinkedHashMap
in Java, aber wo gibt es den "vorherigen" Wert zurück, wenn es keinen Wert für den angegebenen Schlüssel gibt.
Das heißt, ich habe eine Liste von Objekten, die von einem Ganzzahlschlüssel gespeichert werden (in meinem Fall in Zeiteinheiten):
; key->value
10->A
15->B
20->C
Wenn ich also nach einem Wert für den Schlüssel 0-9 fragen würde, würde er zurückkehren null
. Der spezielle Teil ist, wenn ich nach etwas 10 <= i <= 14 frage, würde es A zurückgeben. Oder für i> = 20 würde es C zurückgeben.
Gibt es dafür eine Datenstruktur?
java
data-structures
Nick
quelle
quelle
Antworten:
Sie suchen eine NavigableMap . Dies ist ein Untertyp von SortedMap, für den neben der Art der zu sortierenden Karte auch einige Funktionen verfügbar sind. Beachten Sie, dass die navigierbare Karte "die SortedMap-Schnittstelle ersetzen soll". ( Verbesserungen des Java SE 6 Collections Framework ). Alles, was derzeit implementiert,
SortedMap
implementiertNavigableMap
und dies wird wahrscheinlich wahr bleiben.Insbesondere die Methode,
floorKey(K key)
die "den größten Schlüssel zurückgibt, der kleiner oder gleich dem angegebenen Schlüssel ist, oder null, wenn es keinen solchen Schlüssel gibt.Dies ist nur eine von vielen Methoden, mit denen Sie bestimmte Schlüssel oder Unterkarten der Karte abrufen können.
Java hat zwei Implementierungen der NavigableMap - die TreeMap und die ConcurrentSkipListMap .
Wenn Sie sich die Idee / Implementierung einer Sprungliste ansehen, werden Sie sehen, warum sie mit einer solchen Struktur und ihren Abfragen wirklich gut funktionieren würde.
quelle
LinkedHashMap
er es erwähnt. Weder werdenTreeMap
nochConcurrentSkipListMap
wie nach Einfügezeit geordnetLinkedHashMap
, vielmehr werden sie durch eineComparator
oder die natürliche Reihenfolge des Schlüssels geordnet, wenn sie implementiert werdenComparable
.Was Sie suchen, ist eine Symboltabelle, die geordnete Operationen unterstützt. Und in Ihrem Fall ist es die Bodenoperation.
Die Hash-Implementierung einer Symboltabelle ist die schnellste, bietet jedoch nicht die geordneten Operationen.
Die Baumimplementierung von Symboltabellen tut dies jedoch. Ein Beispiel dafür in Java ist die TreeMap-Klasse
quelle