TreeSet を作成し、それに Map.Entry を追加しようとしています。しかし、これはコンパイルされません。私は何を間違っていますか?
TreeSet<Map.Entry<String, Integer>> treeSet = new TreeSet<Map.Entry<String, Integer>>();
treeSet.add( Map.Entry<String, Integer>("Text string...", 123) );
をインスタンス化しようとしている理由がわかりませんMap.Entry
。単純に a を使用できると思いますTreeMap
。
AbstractMap.SimpleEntry
それでも、それが必要な場合は、次のようにインスタンス化できます。
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
Map.Entry
はインターフェースであることに注意してください。おー!そしてもちろん、@Louis のコメントで正しく指定されているように、 をMap.Entry
実装していないため、Comparable
に追加することはできませんTreeSet
。
ただし、このインターフェースの独自の実装を作成し、その実装を作成してComparable<Map.Entry<K, V>>
、代わりに使用することができます。
しかし、私が言ったように、TreeMap
を使用でき、そのentrySet()
メソッドを使用すると が得られますSet<Map.Entry<K, V>>
。
SortedMap<String, Integer> map = new TreeMap<>();
Set<Map.Entry<String, Integer>> set = map.entrySet();
http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.htmlから:
マップ エントリ (キーと値のペア)。Map.entrySet メソッドは、要素がこのクラスのマップのコレクション ビューを返します。マップ エントリへの参照を取得する唯一の方法は、このコレクション ビューのイテレータから取得することです。これらの Map.Entry オブジェクトは、反復の間のみ有効です。より正式には、マップ エントリの setValue 操作を除いて、イテレータによってエントリが返された後にバッキング マップが変更された場合、マップ エントリの動作は未定義です。
言い換えれば、あなたがやろうとしていることはできません。Rohit Jain が指摘したようにAstractMap.simpleEntry(..)
、 で同様のことを行うことができますが、この世界ではそれが「良い」解決策になるユースケースはほとんどないように思えます。
代わりに、キーと値のペアを に格納したい場合はTreeSet
、独自のオブジェクトを作成する必要があります。TreeMap
とはいえ、 aまたは類似のものを使用しないのはなぜですか?