Löschen ältesten Objekte von HashMap zu erreichen bestimmte Größe?
Ich habe eine hashmap in Java, dass ich eine Einschränkung in der Größe (um 50000). Aber ich sollte löschen Sie nur die Elemente, die die ältesten sind. Der UNIX-timestamp das Element gespeichert ist, in den Eintrag Objekt-Feld:
Map<String, MyModel> snapshot = new HashMap<>();
und
public class MyModel {
private ZonedDateTime createdAt;
//other fields...
}
Ich auch Sie in die Karte, um die von diesem Zeitstempel.
Was wäre der effektivste Weg, um erreichen diese Art der Löschung der jeweils ältesten Einträge? Beachten Sie, dass die "Schwelle" in der Zeit ist nicht bekannt, nur die gewünschte endgültige Größe der Karte.
- Tun Sie Elemente hinzufügen, um die Karte in chronologischer Reihenfolge?
- ja, das Tue ich
- Dann glaube ich, Boris' Antwort ist der effektivste Weg, dies zu tun, oder zumindest die
LinkedHashMap
er Punkte, ob oder nicht Sie verwenden, dieremoveEldestEntry
oder einfach entfernen Sie Einträge direkt (es hat eine Art, zu sagen, was die ältesten Schlüssel ist).
Du musst angemeldet sein, um einen Kommentar abzugeben.
HashMap
hat keine "ältesten", es hat keinen "ersten", hat es keine um.Einen
LinkedHashMap
auf der anderen Seite ist genau HIERFÜR konzipiert ist, hält es eine doppelt verkettete Liste zwischen den Einträgen, so halten Sie Sie einsetzen um, es bietet auch eineremoveEldestEntry
Methode:Ausgabe:
Große Warnung Für Die Gesundheit
LinkedHashMap
JavaDocSortedMap
s auch. Scheint nicht mehr (wahrscheinlich weniger) komplizierter ist, als die Aufrechterhaltung einer separaten Liste. Ich würde wahrscheinlich Blick aufTreeMap
's interals, um zu sehen, wie effizient es ist, aber das scheint wie eine gute Idee.Kann es am einfachsten, einfach zu fügen Sie die String-Objekte zu einer Liste, Wann immer Sie etwas in die Karte. Dann könnten Sie tun:
Diese funktioniert, weil Sie nicht wirklich Pflege über die Zeit, nur die Reihenfolge.
Einer Warteschlange wäre besser als eine Liste, in dieser Hinsicht, wie Sie nicht brauchen etwas anderes als der Zugriff auf und entfernen das erste element
Einfach gesprochen: dann wird ein HashMap nicht tun. Neben den auf der Hand: Sie iterieren alle die Werte, überprüfen, dass das Eigentum; um dann zu entscheiden, die Schlüssel, die Sie entfernen möchten.
In anderen Worten: eine HashMap ist nur, dass eine Verantwortung: Zuordnung von Schlüsseln zu Werten. Es kümmert sich nicht über das einsetzen um, Einfügung Zeit, oder die Häufigkeit der Zugriffe auf Schlüssel. In diesem Sinne: Sie sollten sich in anderen Arten von Implementierungen der Map-Schnittstelle.
Eine alternative wäre die Verwendung eines TreeSet und ein Kunde Komparator, der automatisch Arten basierend auf diesen timestimamps.
Aber Bedenken Sie: es gibt nur zwei schwer, die Dinge in der informatik:
Habe ich geändert, die
LruCache
- Klasse aus dem Android-framework, das zu tun.Hier ist der vollständige code.
Wie zu verwenden
In meinem Beispiel habe ich eine Zuordnung von String-Objekten in Integer-Schlüssel. Die Grenze ist nur 2 Objekte, aber Sie ändern sollten, um Ihr Ziel zu erreichen.
Referenz: LruCache