0

我正在尝试处理大量数据,但我有点坚持处理最终计算的最佳方式。

我有一个哈希图。每个 Book 对象都有一个名为 COUNT 的数据值,它保存该书在我的特定上下文中出现的次数。我想遍历整个 HashMap 并在一个数组中记录前十名最常出现的书籍。同时,我也想把那十本书从HashMap中去掉。做这个的最好方式是什么?

4

4 回答 4

0

我会使用比较计数的比较器将地图复制到一个 SortedMap 中,例如 TreeMap。

其余的应该是显而易见的。

于 2013-03-03T00:56:55.103 回答
0

有一种锦标赛算法在 O(n) 时间内运行,可用于大数据,

从长度为 N 的数组返回前 k 个值的最佳算法

如果数据不是很大,那么我建议使用 Collections.sort 并从您的地图创建一个子列表。

另一种选择是将它们保留在 TreeMap 中并在您的 Book Object 中实现 Comparable ,这样您的 Map 始终是排序的。如果您不想在每次更改对象时对它们进行排序,那么这在您对 Map 进行添加时特别有用。

于 2013-03-03T00:57:05.937 回答
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 或至少保留一个单独的 Map 与大多数阅读书籍。

于 2013-03-03T00:57:26.120 回答
0

我对Java不是很精通,但我可以考虑以下算法。假设 HashMap 根据它们的唯一标识符存储书籍(即它没有给你关于 的排序提示COUNT)。你可以:

  1. 定义一个容量为 10 本书的序列,它们将按 顺序存储在其中COUNT。为了清楚起见,我将这个序列称为O10S(有序 10 元素序列)
  2. 遍历您的哈希图。e对于中的每个元素HashMap
    • 如果未满,O10S则插入eO10S
    • 否则,如果e有一个COUNT高于最小值o的元素(应该很容易识别,因为它是有序的):remove from , insert inO10SCOUNTO10SoO10SeO10S
  3. 对于每个oin O10SoHashMap

该算法相对于其中的元素是线性的HashMap(您只需要遍历HashMap一次)

于 2013-03-03T01:01:53.187 回答