从SortedMap的头中删除多个项目的性能



我在Java中工作,有一个SortedMap,它被实现为ConcurrentSkipListMap。我需要从SortedMap的头中删除一些项目,即键小于某个阈值的所有项目。实际删除的项目数最终可能为0、1或多个。这可能会导致整个SortedMap中的所有项目被删除,但可能性不大(即,极有可能至少有一个项目会大于阈值,尽管不能保证)。

在我看来,应该有一种相当有效的方法来做到这一点,因为我们可以利用以下假设:1)要删除的项目是连续的,2)第一个要删除的项是SortedMap的头(根据#1,其余的项目随后连续)。如果我构建自己的跳过列表,这很容易做到,但我很懒,不想重建内置ConcurrentSkipListMap中已经为我提供的所有逻辑,只为了有一个自定义操作。因此,我的问题是,在使用ConcurrentSkipListMap时,如何利用这些性能假设?

我已经想出了以下方法,但不知道它们是否真的利用了我的假设:

SortedMap<Date, Item> mymap = ConcurrentSkipListMap<Date, Item>();
addItemsToMap(mymap);
Date threshold = calculateThreshold();

方法1:反复进行,删除项目,直到达到阈值。

Iterator<Entry<Date, Item>> itr = mymap.entrySet().iterator();
for (Date key = itr.next().getKey(); key.before(threshold); key = itr.next().getKey())
    itr.remove();

方法2:重复删除第一个项目,直到第一个项目超过阈值。

for (Date key = mymap.firstKey(); key.before(threshold); key = mymap.firstKey())
    mymap.remove(key);

方法3:获取从头到阈值的一组条目,然后删除所有条目。

Iterator<Entry<Date, Item>> itr2 = mymap.headMap(threshold).entrySet().iterator();
while (itr2.hasNext()) {
    itr2.next();
    itr2.remove();
}

方法4:更优雅的#3版本。

mymap.headMap(threshold).clear();

我建议您使用ConcurrentSkipListMap类中提供的tailMap方法。

由于这个Collection是排序的,您可能必须将key传递给需要数据的方法。

您可以查看java文档。

例如,让我们假设我的ConcurrentSkipListMap有密钥1,2,4,5,并且我的阈值是2。我会将2 + 1 = 3传递给tailMap方法,然后返回一个包含45ConcurrentNavigableMap

相关内容

  • 没有找到相关文章

最新更新