Java Map.Entry和TreeSet

时间:2013-10-09 16:44:39

标签: java map treeset

我已经创建了一个TreeSet,我正在尝试添加一个Map.Entry。但这不会编译。我做错了什么?

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

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

2 个答案:

答案 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或类似的?