Gibt es eine Technik, so dass ich eine Zahl n so angeben kann, dass wenn der Eintrag (n + 1) eingefügt wird, zuerst der älteste Eintrag entfernt wird und sichergestellt wird, dass die Größe der Hashtabelle immer auf n beschränkt ist?Wie beschränke ich die Anzahl der Einträge in einer Java-Hashtabelle?
Antwort
Sie suchen nach einem LRU cache vielleicht? Hier ist ein Blog-Post auf einem basierend auf LinkedHashMap.
Ich kam hierher, um LinkedHashMap zu erwähnen, das ich kürzlich für einen LRU-Cache verwendet habe. –
Sie können Apache Collections verwenden. Sie haben eine Reihe von LRU-Implementierungen. Andernfalls können Sie problemlos einen ähnlichen Wrapper für die Standardbibliothekssammlungen schreiben. Ich glaube nicht, dass es einen gibt, den man direkt benutzen kann.
Sie könnten eine doppelendige Warteschlange oder Deque verwenden, und entfernen Sie einfach das erste Element, wenn Sie bei der maximalen Anzahl sind.
Wenn Sie zwischenspeichern, können Sie eine WeakHashMap oder WeakReference verwenden und müssen sich dann keine Gedanken über die Größe des Caches machen.
Nur um zu verdeutlichen, wie man ein verbreitetes Missverständnis vermeidet: WeakHashMap eignet sich NICHT für das LRU-Caching allein; Es verwendet WeakReferences für KEYS, nicht VALUES. Es ist ideal zum Speichern von Metadaten über Objekte, die nicht zu Ihnen gehören. nicht für die Annahme von Einträgen werden bei Speichermangel rausgeworfen – Cowan
LinkedHashMap macht genau das, siehe Javadoc für die removeEldestEntry Methode.
So etwas sollte es tun, wird dies den ältesten eingefügten Eintrag entfernen:
Map map = new LinkedHashMap() {
@Override
protected boolean removeEldestEntry(Entry eldest) {
return size() > N;
}
};
Sie können auch ältesten zugegriffen Eintrag entfernen, indem es im Konstruktor festgelegt wird:
Map map = new LinkedHashMap(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Entry eldest) {
return size() > N;
}
};
Wenn Sie Parallelität braucht, versuchen Sie nicht, dieses Problem selbst zu lösen. Guava CacheBuilder hat eine .maximumSize() -Methode, mit der Sie die Größe einer Karte begrenzen können, obwohl ich weiß, dass alte Einträge möglicherweise bereinigt werden, bevor Sie tatsächlich das Limit erreichen.
Es gibt an interesting page zum Design der Datenstruktur, was den Leser beeindrucken sollte, wie schwierig es wäre, etwas besser zu machen als die Implementierung von Google. :)
- 1. Wie beschränke ich die Anzahl der Datei-Upload in HTML?
- 2. Wie beschränke ich die Anzahl der aktiven Threads in Python?
- 3. Wie bekomme ich die Anzahl der Einträge in einer Messung
- 4. Wie beschränke ich die Anzahl der eingegebenen Zeichen über cin?
- 5. Wie beschränke ich die Anzahl der Dezimalstellen in einer ZedGraph Y-Skala?
- 6. Wie beschränke ich die Anzahl der Zeichen, die in einem XML-Datensatz in asp.net angezeigt werden?
- 7. MongoDB begrenzen die Anzahl der gescannten Einträge
- 8. Django: Beschränke die Anzahl der zurückgegebenen ManyToMany-Objekte
- 9. Sortieren nach Anzahl der Einträge in MySQL
- 10. Anzahl der Einträge in Meta-Tabelle aufnehmen?
- 11. Ich beschränke mich auf die Anzahl der Anfragen, die mir der Kartenanbieter mit OpenLayer stellen kann?
- 12. Anzahl der Einträge zwischen Daten
- 13. Wie beschränke ich die Elemente, die FirebaseRecyclerAdapter vom Server zieht?
- 14. Wie beschränke ich die Anzahl der von diesem LINKEN JOIN zurückgegebenen Zeilen auf eins?
- 15. Wie beschränke ich die Anzahl der für Interbase 7.1 zurückgegebenen Datensätze?
- 16. Anzahl der neuesten Einträge in MySQL finden?
- 17. , wie die Anzahl der Einträge auf lokales Mitglied überprüfen
- 18. Wie beschränke ich die Ergebnisse des Befehls in bash suchen?
- 19. Wie beschränke ich einige der Funktionen von PHPMyAdmin
- 20. Wie beschränke ich die Rahmengröße in einem Matplotlib-Diagramm?
- 21. Wie bekomme ich die Anzahl der Artikel in einer Combobox?
- 22. Wie beschränke ich die Datensammlung in einem Diagramm?
- 23. Wie erhalte ich die ersten 30 Einträge in einer Liste?
- 24. Wird die Anzahl der Fragmentbackstack-Einträge Auswirkungen auf onCreateOptionmenu() haben?
- 25. Anzahl der Einträge in einem Ecto Repository zählen
- 26. R: Zählung der Anzahl der Einträge in einer Spalte mit Ausnahme der Blanks
- 27. Fügen Sie eine temporäre Spalte in mysql, die Einträge sind Zählungen der gleichen Einträge einer Tabelle
- 28. MongoDB: Anzahl Einträge pro Tag
- 29. Wie beschränke ich die Inhaltsvorschau und halte sie lesbar
- 30. Wie beschränke ich Felder, die aus verwandten Sammlungen abgerufen wurden?
Dies ist vergleichbar mit http://stackoverflow.com/questions/272674/what-is-a-data-structure-kind-of-like-a-hash-table-but-infrequently-used-keys -ar. Die Frage bietet eine Lösung. –
@robhruska - denkst du, das zählt als ein Duplikat? Ich bin am Zaun. –
Ich bin mir nicht sicher. Die Perspektiven sind ein wenig anders, da diese Frage nach einer "Größenbeschränkung" fragt, während die andere Frage auf "selten verwendete" Einträge abzielt. Ich bin nicht dagegen, es offen zu lassen, wenn es nur für diejenigen, die es aus dem Blickwinkel dieser Frage betrachten, besser ist. –