我已经创建了一个TreeSet,我正在尝试添加一个Map.Entry。但这不会编译。我做错了什么?
TreeSet<Map.Entry<String, Integer>> treeSet = new TreeSet<Map.Entry<String, Integer>>();
treeSet.add( Map.Entry<String, Integer>("Text string...", 123) );
答案 0 :(得分:3)
我不知道您为什么要尝试实例化Map.Entry
。我想你可以简单地使用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();
答案 1 :(得分: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
或类似的?