NavigableMap vs SortedMap?
Gibt es aus irgendeinem Grund zu verwenden SortedMap
statt NavigableMap
neben der JVM-version? (NavigableMap
hat nur seit 1.6; SortedMap
seit 1.2)
Ich bin auf der Suche nach dem Wert mit dem größten Schlüssel, der Schlüssel <= Referenz-Schlüssel K0. Ich kann nicht scheinen, um herauszufinden, wie dies zu tun ist mit einem SortedMap
(wenn es streng <, dann würd ich das nennen headMap()
und dann lastKey()
und dann get()
), aber NavigableMap.floorEntry()
zu sein scheint, genau das was ich brauche.
Klarstellung: nur als Beispiel, ich bin Umgang mit sparse-Bereiche von Versionsnummern, die mit verschiedenen Modellen des Verhaltens. Die Schlüssel werden könnten [0, 2, 5], sodass mit der version zahlen 0 und 1 behandelt erhalten, indem Sie den Wert im key #0, version Nummern 2-4 bekommen, behandelt, indem der value-at key #2, und Versionsnummern >= 5 erhalten werden durch value-at-Taste #5.
InformationsquelleAutor der Frage Jason S | 2011-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich persönlich bin ein großer Anhänger der mit der geringsten spezifischen Schnittstelle, die bietet, was Sie brauchen. Das macht Ihre Absichten klarer und Orte, die weniger Beschränkungen auf Ihre möglichen Implementierungen.
Wollen die meisten Entwickler Sortierte Sammlungen für die iteration Zwecke, und vielleicht für random-access-performance. Ich habe gesehen, sehr wenigen Fällen, wo ich brauchte ein schließen element.
Wenn Sie brauchen, dass Funktionalität, gehen Sie vor. Ich denke, dass TreeMap implementiert NavigableMap. Aber wenn Sie es nicht brauchen, warum beschränken Sie sich?
InformationsquelleAutor der Antwort Uri
Ja, ich denke, der kann ein Beispiel. Der Anbieter die Karte gewickelt habe es mit
Collections.unmodifiableSortedMap
auch dann, wenn die Quelle war einTreeMap
(die implementiertNavigableMap
) Sie haben nur einen Verweis auf eineSortedMap
und Sie können nicht umgewandelt es zuNavigableMap
.Nun gibt es zwei Fälle: entweder enthält die Karte eine exakte übereinstimmung für den Schlüssel oder nicht. So suchen Sie zunächst nach einer exakten übereinstimmung und nur, wenn es nicht existiert, dann
m.headMap(key).lastKey()
geben die richtige Antwort.Wird dies tun (auch wenn es nicht so effizient wie ein echter
NavigableMap
):InformationsquelleAutor der Antwort finnw
Beim arbeiten mit ganzen zahlen, die Sie verwenden können x < A+1 anstelle von x <= und du bist fertig. Ich meine headMap(A+1) usw. sollte die Arbeit tun. Ansonsten würde ich gehen für finnw die Lösung, da es übersichtlicher ist als alles, was ich kann kommen mit.
InformationsquelleAutor der Antwort maaartinus
Ich denke, dass die Verwendung von Iteratoren ist besser als mit headMap und tailMap, denn es ist nicht effizient. Getestet habe ich den folgenden code für die Fälle, und es funktioniert gut, und floorEntry2 ist drei mal schneller als floorEntry1.
InformationsquelleAutor der Antwort
Ja, wenn Sie brauchen, um eine unveränderliche Karte und Sie sind nicht mit Google Guava.
NavigableMap ersetzen soll, SortedMap. NavigableMap fügt Methoden, um die Schnittstelle SortedMap, die erforderlich sind, ziemlich oft, sind einfach für eine Karte Umsetzer hinzufügen, aber sind umständlich zu schreiben in Bezug auf vorhandene SortedMap Methoden. Rückkehr SortedMap statt NavigableMap verursachen Anrufer von deinem code unnötige Arbeit.
Es ist bedauerlich, dass Sammlungen.unmodifiableNavigableMap war nicht vorgesehen. IMO war dies wahrscheinlich ein versehen, aber es war nicht beseitigt JDK 1.7 also vielleicht hatte jemand einen Grund, es zu verlassen. Ich schlage vor, mit com.google.common.sammeln.Maps.unmodifiableNavigableMap.
InformationsquelleAutor der Antwort kevin cline
"[NavigableMap] ersetzen soll, der SortedMap-interface."
http://download.oracle.com/javase/6/docs/technotes/guides/collections/changes6.html
Trotz dieser, ich Stimme mit Uri: der am wenigsten spezifische Schnittstelle, die Sie können.
InformationsquelleAutor der Antwort Tom