如何在特定索引处获取TreeMap的键和值

时间:2012-06-22 13:16:31

标签: java treemap

我有一个带有一组'Key和Value'对的TreeMap。如何在TreeMap的特定索引处同时获取Key和Value?

编辑:@ TO-ALL:谢谢。但我知道如何使用额外的ArrayList来实现它。我只是想到有没有办法在不使用额外的ArrayList的情况下实现这一点。

6 个答案:

答案 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"