繁体   English   中英

HashMap迭代/删除

[英]HashMap iteration/Deletion

我正在尝试处理大量数据,但是我对处理最终计算的最佳方法有些困惑。

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

我将使用比较计数的比较器将地图复制到SortedMap(例如TreeMap)中。

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

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

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

如果数据不是很大,那么我建议您使用Collections.sort并从您的Map中创建一个subList。

另一个选择是将它们保留在TreeMap中,并在Book对象中实现Comparable,这样您的Map就会始终被排序。 如果您要对地图进行添加,这是特别有用的,因为您不想在每次更改对象时对它们进行排序。

是的,您无法使用for循环删除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,或者至少将阅读最多的Book保留在单独的Map中。

我不是Java熟练者,但是我可以考虑以下算法。 假设HashMap根据书籍的唯一标识符存储书籍(即,它不提供有关COUNT排序提示)。 您可以:

  1. 定义一个容量为10本书的序列,按COUNT顺序将其存储在其中。 为了清楚起见,我将此序列O10S (有序10元素序列)
  2. 遍历您的哈希图。 对于HashMap每个元素e
    • 如果O10S尚未满,请在O10S插入e
    • 否则,如果e具有COUNT比元件更高oO10S具有最小COUNT (这应该是容易识别的,因为O10S被命令):除去oO10S ,插入eO10S
  3. 对于O10S每个o ,从HashMap删除o

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM