我已经创建了一个 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
. 我想你可以简单地使用一个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();
从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
或类似的?