Haben Sie die TreeMap
Dokumentation read?
Eine rot-schwarze baumbasierte NavigableMap-Implementierung. Die Map wird nach der natürlichen Reihenfolge ihrer Schlüssel sortiert, oder nach einem Komparator, der bei der Erstellung der Map zur Verfügung gestellt wird, abhängig davon, welcher Konstruktor verwendet wird.
Diese Implementierung bietet garantierte log (n) Zeitkosten für die containsKey erhalten, setzen und Operationen entfernen. Algorithmen sind Anpassungen von denen in Cormen, Leiserson und Rivest Einführung in Algorithmen.
So ist es eine sortierte Datenstruktur. Obwohl es nicht besagt, können Sie wahrscheinlich davon ausgehen, dass firstKey
und lastKey
entweder konstante Zeit oder O (log N) sind, also rufen Sie die vier von put
, firstKey
, und remove
geben Sie O (log N) gebunden.
Damit dies funktioniert, müssen Sie den Konstruktor der Treemap einen Hinweis, wie die Schlüssel sortiert sind zu geben. Sie haben hier einen kleinen Unterschied zwischen Scala, wo Sie nach einem impliziten Konvertierungsparameter A => Ordered[A]
fragen, und dem TreeMap
Konstruktor (der diesen Parameter nicht kennt), also "die natürliche Reihenfolge seiner Schlüssel verwenden" oder ist in Ihrem Fall möglicherweise nicht korrekt.
Wenn Sie sicherstellen möchten, dass die Schlüssel korrekt sortiert sind, sollten Sie entweder sicherstellen, dass A <: Comparable
, oder geben Sie eine explizite Comparator
.
Da Sie den gleichen Wert wie Schlüssel und Wert speichern, und Sie nie den Wert verwenden, können Sie es auch eine TreeMap[A, Unit]
, oder in der Tat eine TreeSet
machen. Sie könnten auch die java.util.TreeMap
für eine ordnungsgemäße Scala-Sammlung, wie collection.mutable.SortedSet
tauschen. Dies stellt die Bestellung über eine Instanz von Ordering[A]
(eine sogenannte Typklasse) sicher. Es hat die gleichen Methoden firstKey
und lastKey
.
Hinweis: Um den ältesten Wert wie die Fenster Folien zu entfernen, es ist nichts falsch mit einer zweiten Datenstruktur beibehalten wird, die ein schnelle Hinzufügen und Entfernen des ersten oder letzten Elements. Ihre Frage erwähnt auch diese Datenstruktur.
Ich verstehe das Konzept dieses Vergleicher aber ich verstehe nicht, wie ich es umsetzen (ich nur Fehler bekommen) – Jezzie
Ich habe es fast arbeiten. Problem ist, dass, wenn Sie denselben Wert zweimal hinzufügen, zählt es nicht als 2 Instanzen :( – Jezzie
@Jezzy Sie könnten eine 'Map [A, Int]' dann als Multi-Set verwenden. –