在java中,如果我循环遍历keySet()
的{{1}},我如何(在循环内)获取该密钥的数字索引?
基本上,当我循环遍历地图时,我希望能够得到0,1,2 ...我认为这比声明一个int并且每次迭代递增更清晰。
感谢。
答案 0 :(得分:47)
使用LinkedHashMap代替HashMap 调用keySet()
时,它将始终以相同的顺序(作为插入)返回键有关详细信息,请参阅Class LinkedHashMap
答案 1 :(得分:42)
不确定这是否更“干净”,但是:
List keys = new ArrayList(map.keySet());
for (int i = 0; i < keys.size(); i++) {
Object obj = keys.get(i);
// do stuff here
}
答案 2 :(得分:21)
HashMap没有明确的键排序。
答案 3 :(得分:11)
如果您要做的只是从hashmap本身获取值,您可以执行以下操作:
for (Object key : map.keySet()) {
Object value = map.get(key);
//TODO: this
}
或者,您可以迭代地图的条目,如果这是您感兴趣的内容:
for (Map.Entry<Object, Object> entry : map.entrySet()) {
Object key = entry.getKey();
Object value = entry.getValue();
//TODO: other cool stuff
}
作为一个社区,如果我们知道您为什么需要索引或者您认为索引可以为您做什么,我们可能会给您更好/更合适的答案。
答案 4 :(得分:9)
你不能 - 一个集合是无序的,因此没有提供索引。正如你所说,你必须声明一个int。请记住,下次调用keySet()时,您不一定会得到相同顺序的结果。
答案 5 :(得分:5)
简单地说,基于散列的集合没有编入索引,所以你必须手动完成。
答案 6 :(得分:4)
我最近在学习Hashmap背后的概念,很明显没有确定的密钥排序。 要迭代,您可以使用:
Hashmap<String,Integer> hs=new Hashmap();
for(Map.Entry<String, Integer> entry : hs.entrySet()){
String key=entry.getKey();
int val=entry.getValue();
//your code block
}
答案 7 :(得分:3)
将此作为@Binil Thomas答案同样可行的替代方案 - 试图将其添加为评论,但并不相信这一切的可读性。
int index = 0;
for (Object key : map.keySet()) {
Object value = map.get(key);
++index;
}
可能没有帮助原始问题海报,因为这是他们试图避免的字面情况,但可能会帮助其他人寻找一个简单的答案。
答案 8 :(得分:-1)
我不知道这是你要找的东西
List keys = new ArrayList(map.keySet());
int index = keys.indexOf(element);