19

我有一个带有一组“键和值”对的 TreeMap。如何在 TreeMap 的特定索引处同时获取键和值?

编辑:@TO-ALL:谢谢。但我知道如何通过使用额外的 ArrayList 来实现它。我只是想有什么方法可以在不使用额外的 ArrayList 的情况下实现这一点。

4

6 回答 6

26

如果您真的想使用 TreeMap 并按位置获取,可以使用以下内容:

key => treemap.keySet().toArray()[0]
value => treemap.get(key); 

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

treemap.values().toArray()[0]; 

但我建议你使用迭代器,就像上面的方法一样,它需要在你想找到的时候创建数组(所以效率不高),而且你应该足够小心以确保索引不会超出范围。

于 2012-06-22T13:30:51.477 回答
8

首先,我不确定为什么这里的人们如此频繁地关注问题的有效性。在许多情况下,人们认为按排序顺序维护 ArrayList 是合适的。对于大型列表,按排序顺序维护 ArrayList 效率极低。

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

我发现这个缺点非常严重,以至于我编写了自己的 AVL 映射,它可以通过索引有效地获取元素并计算 indexOf(E)。使这成为可能就像维护条目的每个左右分支的大小一样简单。Glazedlists 库有可能在某处嵌入了可搜索的树。您可能希望对此进行审查。

于 2013-10-24T17:08:38.560 回答
6

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

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);

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

于 2012-06-22T13:33:01.760 回答
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);
于 2012-06-22T13:30:17.853 回答
1

这可能会有所帮助

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));
}
于 2017-02-25T13:47:27.553 回答
-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"
于 2014-03-06T16:38:57.650 回答