2

LinkedHashSetの Javadoc によると、内部で双方向リンク リストを使用して、挿入された要素の挿入順序を保持します。

すべてのエントリを実行する二重リンク リストを維持します。このリンクされたリストは、要素がセットに挿入された順序 (挿入順序) である反復順序を定義します。

最初に挿入された要素を取得したい場合は、次のようなコードを使用できます。

linkedHashSet.iterator().next()

これにより、O(1) のセットに最初に挿入された要素が得られます。

O(1)のセットに挿入された最新の要素にアクセスする必要がある問題を解決しようとしています。セットに挿入された要素が重複していないと仮定しましょう。例えば、

linkedHashSet.add(2); // the most recent inserted element in the set is 2
linkedHashSet.add(3); // the most recent inserted element in the set is 3
linkedHashSet.add(5); // the most recent inserted element in the set is 5
linkedHashSet.remove(5); // the most recent inserted element in the set is 3 because 5 is removed and not in the set now

セット内の双方向リンク リストであるため、最新の要素は双方向リンク リストの最後の要素である必要があり、それを取得する API があれば O(1) でアクセスできるはずです。

私の質問は: JDK でこれを行う方法はありますか、またはこれを行うには独自の ReversedIteratingLinkedHashSet を作成する必要がありますか?

基本的に、挿入/削除/検索/セットに最後に挿入された要素のチェックなど、すべての操作で O(1) 時間の複雑さを持つセット データ構造を見つけようとします。組み込みの LinkedHashSet は、内部的に非常に小さな変更を加えるだけでうまく収まるように見えますが、これがデフォルトの JDK クラス API で実行できるかどうかはわかりません。

注: JDK のソース コードを確認したところ、LinkedHashSet が LinkedHashMap で内部的に実装されていることがわかりました。LinkedHashMap を使用して O(1) に挿入された最新の要素にアクセスできるソリューションがあれば、それは私にとっても役立ちます。

どうもありがとう。

4

1 に答える 1

2

残念ながら、 O(1)の a LinkedHashSet(または) に最近追加された要素にアクセスするための直接的でクリーンな方法はないようです。LinkedHashMap

クリーンな方法は、セットを配列に変換して最後の要素にアクセスすることですが、それは O(n) になります。

リフレクションを使用して、内部ハッシュ マップ、マップのヘッド エントリ、最後にエントリの先行エントリ ( before) にアクセスするという汚い方法があります。

于 2013-07-25T13:20:58.210 に答える