2010-04-21 71 views
34

在java中,如果我正在循环访问HashMapkeySet(),我该如何(在循环内部)获取该键的数字索引?Java - 获取HashMap中的密钥索引?

基本上,当我通过地图循环时,我希望能够得到0,1,2 ......我认为这将比每次迭代声明一个int并递增更清晰。

谢谢。

+3

你需要什么?正如答案中所提到的,在地图中的顺序不一定是固定的,当键被添加或删除时它可以改变。 – extraneon 2010-04-21 19:54:16

+5

更好的是两个相等的HashMap仍然可以有不同的顺序。他们可以做到这一点*即使他们有相同的添加/删除历史*(不同的能力会做到这一点)。 – 2010-04-21 20:08:05

+0

http://stackoverflow.com/questions/18188739/arraylist-of-hashmap-or-linkedhashmap-to-get-item-by-index/18959271#18959271 – 2013-09-23 12:36:17

回答

4

简而言之,基于散列的集合没有编入索引,因此您必须手动完成。

+0

在这种情况下推荐的数据结构是什么? – 2016-01-24 20:27:26

18

HashMap没有定义键的顺序。

8

你不能 - 一组是无序的,所以没有提供索引。正如你所说,你必须声明一个int。请记住,下次您调用keySet()时,您不一定会以相同的顺序得到结果。

+1

如果OP确实需要这样做,那么编写由TreeSet和Map支持的集合并不困难。这样,您可以始终以相同的顺序获得结果。现在至于如何在迭代期间修改Map时的行为取决于OP,但是数据结构是键在有序集中的映射是绝对可行的。 (顺便说一句,我更多地评论你的答案,而不是OP的问题)。 – SyntaxT3rr0r 2010-04-21 20:07:17

36

不知道这是什么“清洁剂”,而是:

List keys = new ArrayList(map.keySet()); 
for (int i = 0; i < keys.size(); i++) { 
    Object obj = keys.get(i); 
    // do stuff here 
} 
+1

或类似的:'int index = 0; for(Object key:map.keySet()){'Object value = map.get(key); ++索引; } // dang格式化 – benjineer 2015-12-01 09:40:06

10

如果你正在试图做的就是值了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 
} 

由于一个社区,如果我们知道你为什么需要这些索引或者你认为索引可以为你做什么,我们可能会给你更好/更合适的答案。

45

使用LinkedHashMap的,而不是HashMap的 它总是返回相同的顺序键(如插入)调用键设置()

有关更多详细信息,请参阅Class LinkedHashMap

+0

顺序可能并不重要 - 例如,我们可能只需要测试第一个或最后一个读取对。 – benjineer 2015-12-01 09:50:39

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 
    } 
2

发布这是一个同样可行的替代@Binil托马斯的答案 - 试图将其添加为一个评论,但不相信这一切的可读性。

int index = 0; 

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    ++index; 
} 

可能不利于原题的海报,因为这是他们试图避免字面的情况,但可以帮助别人寻找一个简单的答案。