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. 我想你可以简单地使用一个TreeMap.

即使,如果你愿意,你可以AbstractMap.SimpleEntry像这样实例化:

Map.Entry<String,Integer> entry =
    new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);

请注意,这Map.Entry是一个接口。哦!当然,正如@Louis 在评论中正确指定的那样,Map.Entry没有实现 a Comparable,因此您将无法将其添加到TreeSet.

但是,您可以创建自己的此接口的实现,制作该实现Comparable<Map.Entry<K, V>>,然后使用它。


但正如我所说,你可以使用 a TreeMap,并使用它的entrySet()方法,这会给你 a 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(..)使用 .

相反,如果您想在 a 中存储键/值对,则TreeSet需要创建自己的对象。也就是说 - 为什么不使用 aTreeMap或类似的?

于 2013-10-09T16:49:03.087 回答