3

私はJavaで作業しており、ConcurrentSkipListMapとして実装されているSortedMapを持っています。SortedMap の先頭からいくつかの項目を削除する必要があります。つまり、キーがしきい値よりも小さいすべての項目です。実際に削除されるアイテムの数は、0、1、または複数になる可能性があります。これにより、SortedMap 全体のすべてのアイテムが削除される可能性はありますが、ほとんどありません (つまり、少なくとも 1 つのアイテムがしきい値より大きくなる可能性は非常に高いですが、保証されていません)。

1) 削除する項目が連続しており、2) 削除する最初の項目が SortedMap の先頭であるという仮定を利用できるため、これをかなり効率的に行う方法があるはずです (そして#1に従って、残りはその後連続して続きます)。独自のスキップ リストを作成する場合、これは非常に簡単に行うことができますが、怠け者であり、組み込みの ConcurrentSkipListMap で既に提供されているすべてのロジックを再構築して、この 1 つのカスタム操作を実行したくありません。私の質問は、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: head からしきい値までのエントリのセットを取得し、それらをすべて削除します。

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 docsをご覧ください。

たとえば、ConcurrentSkipListMapキーが1,2,4,5あり、しきい値が 2 であると仮定します。メソッドに渡す2 + 1 = 3と、 withとin が返されます。tailMapConcurrentNavigableMap45

于 2013-07-02T23:55:59.370 に答える