我正在尝试处理大量数据,但我有点坚持处理最终计算的最佳方式。
我有一个哈希图。每个 Book 对象都有一个名为 COUNT 的数据值,它保存该书在我的特定上下文中出现的次数。我想遍历整个 HashMap 并在一个数组中记录前十名最常出现的书籍。同时,我也想把那十本书从HashMap中去掉。做这个的最好方式是什么?
我会使用比较计数的比较器将地图复制到一个 SortedMap 中,例如 TreeMap。
其余的应该是显而易见的。
有一种锦标赛算法在 O(n) 时间内运行,可用于大数据,
如果数据不是很大,那么我建议使用 Collections.sort 并从您的地图创建一个子列表。
另一种选择是将它们保留在 TreeMap 中并在您的 Book Object 中实现 Comparable ,这样您的 Map 始终是排序的。如果您不想在每次更改对象时对它们进行排序,那么这在您对 Map 进行添加时特别有用。
是的,您不能使用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 或至少保留一个单独的 Map 与大多数阅读书籍。
我对Java不是很精通,但我可以考虑以下算法。假设 HashMap 根据它们的唯一标识符存储书籍(即它没有给你关于 的排序提示COUNT
)。你可以:
COUNT
。为了清楚起见,我将这个序列称为O10S
(有序 10 元素序列)e
对于中的每个元素HashMap
:
O10S
则插入e
O10S
e
有一个COUNT
高于最小值o
的元素(应该很容易识别,因为它是有序的):remove from , insert inO10S
COUNT
O10S
o
O10S
e
O10S
o
in O10S
,o
从HashMap
该算法相对于其中的元素是线性的HashMap
(您只需要遍历HashMap
一次)