我有一个map
,我想检索插入到map
上的最后 50个项目,或最后一个添加到map
的项目< strong> 2秒(以较大者为准)..
最有效的方法是什么?
Map<Date, Book> books = new HashMap<Date, Book>();
注意: -我想最大化吞吐量并最小化延迟。 -我想在JVM上运行并最小化堆占用空间。
答案 0 :(得分:2)
使用堆栈存储Date
,然后从堆栈中弹出项作为键。
每当您在 HashMap 中输入条目时,只需按Date
作为键即可。
答案 1 :(得分:1)
用一句话回答您的问题:
默认情况下,地图没有最后一项,也不属于合同的一部分。 (哈希图)存储优化的项目内存。
可能的解决方案 排序的地图:
您可以通过lastEntry方法访问最后一个条目:
NavigableMap<String,Integer> map = new TreeMap<String, Integer>();
// add some entries
Entry<String, Integer> lastEntry = map.lastEntry();
或者您使用链接地图:
Map<String,String> map = new LinkedHashMap<String, Integer>();
// add some entries
List<Entry<String,Integer>> entryList =
new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Entry<String, Integer> lastEntry =
entryList.get(entryList.size()-1);
都是本机Java库。
答案 2 :(得分:0)
由于要获取last items by date,因此Map<Date, Book> books
的密钥可以执行以下操作:
protected static List<Book> getLastXBooks(Map<Date, Book> books, int x) {
return books.entrySet().stream()
.sorted(Comparator.<Entry<Date, Book>, Date> comparing(Entry::getKey).reversed())
.limit(x)
.map(Entry::getValue)
.collect(Collectors.toList());
}
protected static List<Book> getBooksOfLastXSeconds(Map<Date, Book> books, int seconds) {
long now = System.currentTimeMillis();
long msAgo = System.currentTimeMillis() - seconds * 1000;
return books.entrySet().stream()
.filter(e -> e.getKey().getTime() <= now && e.getKey().getTime() >= msAgo)
.sorted(Comparator.<Entry<Date, Book>, Date> comparing(Entry::getKey).reversed())
.map(Entry::getValue)
.collect(Collectors.toList());
}
在getBooksOfLastXSeconds
中,我添加了排序以使结果易于比较。毫无疑问,这是没有必要的。
让我们举个例子:
public static void main(String[] args) {
Map<Date, Book> books = new HashMap<Date, Book>();
for (int i = 0; i < 100; i++) {
Book book = new Book("Book " + (100 - i));
books.put(new Date(System.currentTimeMillis() - i * 100), book);
System.out.println(book);
}
List<Book> last50 = getLastXBooks(books, 50);
System.out.println(last50); // [Book: Book 100, Book: Book 99, ... Book 51, Book: Book 50]
List<Book> booksOfLast2Seconds = getBooksOfLastXSeconds(books, 2);
System.out.println(booksOfLast2Seconds); // [Book: Book 100, Book: Book 99, ... Book 82, Book: Book 81]
}
编辑
最有效的方法是什么?
最有效的方法是按插入日期订购书籍。然后,不必比较所有书籍(执行上面的sort
)即可获得最后50本书。您可以使用LinkedHashMap
保留插入顺序。插入顺序必须是Date
的{{3}},因此必须是时间顺序。