[英]HashMap iteration/Deletion
我正在尝试处理大量数据,但是我对处理最终计算的最佳方法有些困惑。
我有一个HashMap。 每个Book对象都有一个称为COUNT的数据值,该值保存该书在我的特定上下文中出现的次数。 我想遍历整个HashMap,并在数组中记录前十名最出现的书籍。 同时,我还想从HashMap中删除前十本书。 做这个的最好方式是什么?
我将使用比较计数的比较器将地图复制到SortedMap(例如TreeMap)中。
其余的应该是显而易见的。
有一种锦标赛算法可以在O(n)时间运行,对大数据有用,
如果数据不是很大,那么我建议您使用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
排序提示)。 您可以:
COUNT
顺序将其存储在其中。 为了清楚起见,我将此序列O10S
(有序10元素序列) HashMap
每个元素e
:
O10S
尚未满,请在O10S
插入e
e
具有COUNT
比元件更高o
在O10S
具有最小COUNT
(这应该是容易识别的,因为O10S
被命令):除去o
从O10S
,插入e
在O10S
O10S
每个o
,从HashMap
删除o
该算法相对于HashMap
中的元素是线性的(您只需要遍历HashMap
一次)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.