HashMap迭代/删除

时间:2013-03-03 00:48:05

标签: java list iterator hashmap

我正在尝试处理大量数据,而且我有点陷入处理最终计算的最佳方式。

我有一个HashMap。每个Book对象都有一个名为COUNT的数据值,用于保存该书在我的特定上下文中出现的次数。我想遍历整个HashMap并记录数组中出现最多的十本书。与此同时,我还希望从HashMap中删除那些前十本书。这样做的最佳方式是什么?

4 个答案:

答案 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的排序提示)。你可以:

  1. 定义一个容量为10本书的序列,其中将按COUNT排序。为清楚起见,我将调用此序列O10S(有序的10元素序列)
  2. 遍历您的hashmap。对于e中的每个元素HashMap
    • 如果O10S尚未填充,请在e
    • 中插入O10S
    • 否则,如果e的{​​{1}}高于COUNTo的{​​{1}},则O10S最低COUNTO10S应该可以轻松识别o 1}}已订购):从O10S移除e,在O10S
    • 中插入o
  3. 对于O10S中的每个o,请从HashMap
  4. 中删除HashMap

    该算法与HashMap中的元素呈线性关系(您只需要遍历{{1}}一次)