0

TreeSet を作成し、それに Map.Entry を追加しようとしています。しかし、これはコンパイルされません。私は何を間違っていますか?

TreeSet<Map.Entry<String, Integer>> treeSet = new TreeSet<Map.Entry<String, Integer>>();

treeSet.add( Map.Entry<String, Integer>("Text string...", 123) );
4

2 に答える 2

3

をインスタンス化しようとしている理由がわかりません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();
于 2013-10-09T16:48:31.487 に答える
1

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または類似のものを使用しないのはなぜですか?

于 2013-10-09T16:49:03.087 に答える