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