我有一个带有一组'Key和Value'对的TreeMap。如何在TreeMap的特定索引处同时获取Key和Value?
编辑:@ TO-ALL:谢谢。但我知道如何使用额外的ArrayList来实现它。我只是想到有没有办法在不使用额外的ArrayList的情况下实现这一点。答案 0 :(得分:23)
如果您真的想使用TreeMap并按位置获取,可以使用以下内容:
key => treemap.keySet().toArray()[0]
value => treemap.get(key);
OR(如果你只想要价值)
treemap.values().toArray()[0];
但是我建议你使用iterator,就像在上面的方法中一样,它需要在你想要找到时创建数组(所以效率不高),而且你应该小心,以确保索引不会消失达到。
答案 1 :(得分:7)
首先,我不确定为什么这里的人经常关注问题的有效性。在许多情况下,人们认为适合按排序顺序维护ArrayList。按排序顺序维护ArrayList对于大型列表来说效率非常低。
标准Java(Oracle)源代码分发的Entry节点不保持其后代树的大小。因此,如果没有低效的顺序搜索,就无法通过索引识别地图中的元素。
我发现这个缺点非常严重,以至于我编写了自己的AVL地图,可以通过索引高效地获取元素并计算indexOf(E)。实现这一点就像保持Entry的左右分支的大小一样简单。有一个机会,Glazedlists库有一个可搜索的树嵌入它的某个地方。您可能希望对此进行审核。
答案 2 :(得分:4)
您可以复制数组列表中的条目集,然后按索引获取所需的条目:
list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);
但是a)复制需要O(N)时间,b)当treeMap改变时,列表变为无效。
答案 3 :(得分:2)
这可能不是最佳方法,但您可以在特定索引处访问您的键/值。
TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);
答案 4 :(得分:0)
这可能会有所帮助
TreeMap< String,Integer > ht=new TreeMap<>();
ht.put("12",1);
ht.put("22",2);
ht.put("32",3);
ht.put("42",4);
for(int i=0;i<ht.size();i++)
{
System.out.println(new Vector(ht.keySet()).get(i));
System.out.println(new Vector(ht.values()).get(i));
}
答案 5 :(得分:-2)
这是另一个从值中获取密钥的选项:
Map<String, String> map = new HashMap<String, String>();
map.put("s1", "s1Val");
map.put("s2", "s2Val");
map.put("s3", "s3Val");
// ex: "s2Val" -> return "s2"
int index = new ArrayList<String>(map.values()).indexOf("s2Val");
System.out.println(map.keySet().toArray()[index]); // -> return "s2"