从商品地图java中检索最后n个商品

时间:2018-10-11 18:40:00

标签: java dictionary data-structures

我有一个map,我想检索插入到map上的最后 50个项目,或最后一个添加到map的项目< strong> 2秒(以较大者为准)..

最有效的方法是什么?

Map<Date, Book> books = new HashMap<Date, Book>();

注意: -我想最大化吞吐量并最小化延迟。 -我想在JVM上运行并最小化堆占用空间。

3 个答案:

答案 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}},因此必须是时间顺序。