我有一个带有一组“键和值”对的 TreeMap。如何在 TreeMap 的特定索引处同时获取键和值?
编辑:@TO-ALL:谢谢。但我知道如何通过使用额外的 ArrayList 来实现它。我只是想有什么方法可以在不使用额外的 ArrayList 的情况下实现这一点。
如果您真的想使用 TreeMap 并按位置获取,可以使用以下内容:
key => treemap.keySet().toArray()[0]
value => treemap.get(key);
或者(如果你只想要价值)
treemap.values().toArray()[0];
但我建议你使用迭代器,就像上面的方法一样,它需要在你想找到的时候创建数组(所以效率不高),而且你应该足够小心以确保索引不会超出范围。
首先,我不确定为什么这里的人们如此频繁地关注问题的有效性。在许多情况下,人们认为按排序顺序维护 ArrayList 是合适的。对于大型列表,按排序顺序维护 ArrayList 效率极低。
标准 Java (Oracle) 源代码分发的 Entry 节点不保持其后代树的大小。因此,如果没有低效的顺序搜索,就不可能通过索引来识别地图中的元素。
我发现这个缺点非常严重,以至于我编写了自己的 AVL 映射,它可以通过索引有效地获取元素并计算 indexOf(E)。使这成为可能就像维护条目的每个左右分支的大小一样简单。Glazedlists 库有可能在某处嵌入了可搜索的树。您可能希望对此进行审查。
您可以复制数组列表中的条目集,然后通过索引获取所需的条目:
list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);
但是a)复制需要O(N)时间,b)当treeMap发生变化时,列表变得无效。
这可能不是最好的方法,但您将能够在特定索引处访问您的键/值。
TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);
这可能会有所帮助
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));
}
这是从值中获取密钥的另一种选择:
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"