Sie haben würde so eine Karte selbst zu implementieren, glaube ich. Du hast recht, dass es sortiert werden müsste; Die Implementierung von get
müsste die Schlüssel durchlaufen, bis der größte Schlüssel gefunden wird, der kleiner oder gleich dem Argument ist.
Wenn Sie die Unterklasse TreeMap
ableiten, würde es am Anfang erscheinen, dass Sie diese Funktion erhalten, indem Sie einfach die get()
Methode überschreiben. Um jedoch so viel wie möglich vom Map-Vertrag beizubehalten, müssen Sie andere Methoden aus Konsistenzgründen überschreiben.
Und was ist z.B. containsKey()
? Enthält Ihr Hauptverzeichnis ein Mapping für 40
? Wenn Sie false
zurückgeben, kann ein Client basierend auf dieser Information entscheiden, get()
nicht aufzurufen; Aus diesem Grund (und der formalen Definition) müssen Sie true
zurückgeben. Aber dann ist es schwierig zu bestimmen, ob die Karte ein gegebenes Mapping "wirklich enthält". Wenn Sie etwas aktualisieren möchten, ohne etwas zu überschreiben, das bereits existiert.
Die remove()
Methode könnte auch schwierig sein. Aus meiner Lektüre der Schnittstelle,
// Calling map.remove "Removes the mapping for a key from this map if it is present."
map.remove(x);
// Now that the mapping is removed, I believe the following must hold
assert map.get(x) == null;
assert map.containsKey(x);
hier konsequent handeln würde sehr schwierig. Wenn Sie beispielsweise ein Mapping von 35-40 haben und Sie remove(38)
aufrufen, dann müssten Sie, wie ich es verstehe, null
für alle nachfolgenden Gets für den Schlüssel 38 zurückgeben, aber die oben erwähnte Zuordnung für die Schlüssel 35-37 oder 39 zurückgeben -40.
So, während Sie einen Start auf diesem durch zwingende TreeMap machen, vielleicht das ganze Konzept von Map
ist nicht ganz das, was Sie hier wollen. Wenn Sie dieses Verhalten nicht in vorhandene Methoden einfügen müssen, die Map
übernehmen, ist es möglicherweise einfacher, es als eigenständige Klasse zu erstellen, da es nicht ist, sondern eine eine Karte ist, wie Sie es definieren.
Sie meinen '<= 41' ich denke. Aber suchst du immer nach '39,41,43,45' oder sollte es funktionieren, wenn du mit' 40,42,50' versuchst? Und gibt es immer nur einen dazwischen? –
Mögliches Duplikat von [Datenstrukturen, die einen Bereich von Schlüsseln auf einen Wert abbilden können] (https://stackoverflow.com/questions/13399821/data-structures-that-can-map-a-range-of-keys-to -a-Wert) – Vadzim