36

列挙型は比較可能です。つまり、

NavigableSet<AccessMode> modes = new TreeSet<>();
NavigableMap<AccessMode, Object> modeMap = new TreeMap<>();

これらのアクセス時間はO(ln N)です。

列挙型コレクションにはO(1)アクセス時間がありますが、ナビゲートできません

NavigableSet<AccessMode> modes = EnumSet.noneOf(AccessMode.class); // doesn't compile
NavigableMap<AccessMode, Object> modeMap = new EnumMap<>(AccessMode.class);  // doesn't compile

列挙型コレクションがナビゲート可能(およびソート済み)ではない理由があるのではないかと思っていました。つまり、私は何かが足りないのですか?

4

3 に答える 3

40

JDKとそのさまざまなAPIには、多くの「明らかな」機能がありません。なぜこの特定の機能が省略/忘れられたのですか?推測することしかできません。しかし、あなたの質問は長い間Sun/OracleでのRFEでした。

コメントすることで、これらのRFEをサポートできます。この件に関するJoshuaBlochによる信頼できる回答は次のとおりです。

ぼんやりと考えたことは思い出しますが、正当な理由で明示的に却下したかどうかは思い出せません。EnumSetとEnumMapを実装したときは非常に時間が不足していたため、決定に時間がかかった可能性があります。

http://comments.gmane.org/gmane.comp.java.jsr.166-concurrency/2158

だから彼でさえ推測しなければならなかった:-)

于 2012-07-19T09:05:03.840 に答える
9

私の推測では、ナビゲーション可能性は列挙型セットの主要なユースケースとは見なされていませんでした。実装には、ナビゲート可能性を妨げるものは何もありません。列挙型メンバーのセットの必要性とナビゲーション性を組み合わせたまれなユースケースは、とでカバーされていTreeSetますTreeMap

于 2012-07-19T08:52:30.703 に答える
2

投稿は質問に直接答えることはなく、試みもしません。Navigableが導入された理由を伝えるだけです。

リクエストされたとおりに投稿します(コメントするには長すぎます)

簡単に言えば、Navigableが存在するのは、今後の「ディフェンダー」のようなものがなかったためです。Sortedはすべての一般的な機能を説明していなかったため、新しいインターフェイスを導入する以外にその方法はありませんでした。実際には、宣言タイプとして「Sorted」は「Navigable」よりもはるかに頻繁に使用されると確信しています。ほとんどの人は、Navigableで定義されているが、Sortedではないメソッドを必要としないからです。さらに、「Navigable」はあまりいい名前ではありません:-)

-ダグ

于 2012-07-24T09:46:18.847 に答える