我正在尝试处理大量数据,而且我有点陷入处理最终计算的最佳方式。
我有一个HashMap。每个Book对象都有一个名为COUNT的数据值,用于保存该书在我的特定上下文中出现的次数。我想遍历整个HashMap并记录数组中出现最多的十本书。与此同时,我还希望从HashMap中删除那些前十本书。这样做的最佳方式是什么?
答案 0 :(得分:0)
我会使用比较计数的比较器将地图复制到SortedMap,例如TreeMap。
其余的应该是显而易见的。
答案 1 :(得分:0)
有一种锦标赛算法在O(n)时间内运行,对大数据非常有用,
Optimal algorithm for returning top k values from an array of length N
如果数据不是很大,那么我建议使用Collections.sort并从Map创建一个子列表。
另一种选择是将它们保存在TreeMap中并在Book对象中实现Comparable,这样就可以对Map进行排序。如果您正在添加Map,因为每次更改对象时都不想对它们进行排序,这将非常有用。
答案 2 :(得分:0)
是的,您无法使用for
循环删除,因为这样
for(Book curBook: yourMap.values())
您将获得ConcurrentModificationException
。要在迭代时删除元素,必须使用迭代器,例如:
HashMap<Book> yourMap;
Collection<Book> entries = yourMap.values();
Iterator<Book> iterator = entries.iterator();
while(iterator.hasNext()) {
Book curBook = iterator.next();
if (yourConditionToRemove) {
iterator.remove();
}
}
如果这是一个频繁的操作,请考虑使用Bohemian建议的TreeMap,或者至少与大多数阅读书籍保持单独的地图。
答案 3 :(得分:0)
我不是那么精通Java,但我可以考虑以下算法。假设HashMap根据其唯一标识符存储书籍(即它没有给出关于COUNT
的排序提示)。你可以:
COUNT
排序。为清楚起见,我将调用此序列O10S
(有序的10元素序列)e
中的每个元素HashMap
:
O10S
尚未填充,请在e
O10S
e
的{{1}}高于COUNT
中o
的{{1}},则O10S
最低COUNT
(O10S
应该可以轻松识别o
1}}已订购):从O10S
移除e
,在O10S
o
O10S
中的每个o
,请从HashMap
HashMap
醇>
该算法与HashMap
中的元素呈线性关系(您只需要遍历{{1}}一次)