3

我正在使用 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();

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

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();
4

1 回答 1

0

我建议你使用课堂上tailMap提供的方法ConcurrentSkipListMap

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

您可以查看java 文档

例如 - 让我们假设我的ConcurrentSkipListMap有键1,2,4,5并且我的阈值是 2。我将传递2 + 1 = 3给该tailMap方法,然后我会在其中返回一个ConcurrentNavigableMapwith45

于 2013-07-02T23:55:59.370 回答