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

Dil*_*rla 17 java treemap

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

编辑:@ TO-ALL:谢谢.但我知道如何使用额外的ArrayList来实现它.我只是想到有没有办法实现这一点,而无需使用额外的ArrayList.

Cha*_*dra 23

如果您确实想要使用TreeMap并按位置获取,则可以使用以下命令:

key => treemap.keySet().toArray()[0]
value => treemap.get(key); 
Run Code Online (Sandbox Code Playgroud)

或者(如果你只想要价值)

treemap.values().toArray()[0]; 
Run Code Online (Sandbox Code Playgroud)

但我建议你使用迭代器,就像在上面的方法中一样,它需要在你想要找到时创建数组(所以不那么有效),而且你应该小心,以确保索引不会无法触及.


小智 7

首先,我不确定为什么这里的人经常关注问题的有效性.在许多情况下,人们认为适合按排序顺序维护ArrayList.按排序顺序维护ArrayList对于大型列表来说效率非常低.

标准Java(Oracle)源代码分发的Entry节点不保持其后代树的大小.因此,如果没有低效的顺序搜索,就无法通过索引识别地图中的元素.

我发现这个缺点非常严重,以至于我编写了自己的AVL映射,可以通过索引高效地获取元素并计算indexOf(E).实现这一点就像保持Entry的左右分支的大小一样简单.有一个机会,Glazedlists库有一个可搜索的树嵌入它的某个地方.您可能希望对此进行审核.


Ale*_*dov 5

您可以复制数组列表中的条目集,然后通过索引获取所需的条目:

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);
Run Code Online (Sandbox Code Playgroud)

但是 a) 复制需要 O(N) 时间和 b) 当 treeMap 更改时,列表变得无效。


Jea*_*tin 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);
Run Code Online (Sandbox Code Playgroud)