Java-在HashMap中获取键的索引?

Java-在HashMap中获取键的索引?,java,iteration,hashmap,Java,Iteration,Hashmap,在java中,如果我在HashMap的keySet()上循环,我如何(在循环中)获取该键的数字索引 基本上,当我在映射中循环时,我希望能够得到0,1,2…我认为这比声明一个int并随着每次迭代而递增更干净 谢谢。简单地说,基于散列的集合没有索引,因此您必须手动执行。散列映射没有定义键的顺序。您不能-集合是无序的,因此没有提供索引。正如您所说,您必须声明一个int。请记住,下次调用keySet()时,不一定会以相同的顺序得到结果。不确定这是否“更干净”,但是: List keys=new Arra

在java中,如果我在
HashMap
keySet()
上循环,我如何(在循环中)获取该键的数字索引

基本上,当我在映射中循环时,我希望能够得到0,1,2…我认为这比声明一个int并随着每次迭代而递增更干净


谢谢。

简单地说,基于散列的集合没有索引,因此您必须手动执行。

散列映射没有定义键的顺序。

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

不确定这是否“更干净”,但是:

List keys=new ArrayList(map.keySet());
对于(int i=0;i
如果您只想从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
}
for(Map.Entry:Map.entrySet()){
Object key=entry.getKey();
对象值=entry.getValue();
//TODO:其他很酷的东西
}

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

使用LinkedHashMap而不是HashMap 调用keySet()时,它将始终按与插入相同的顺序返回键


有关更多详细信息,请参见

我最近学习了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  
  }
Hashmap hs=newhashmap();
对于(Map.Entry:hs.entrySet()){
String key=entry.getKey();
int val=entry.getValue();
//你的代码块
}

将此作为@Binil Thomas答案的一个同样可行的替代方案发布-试图将其添加为评论,但不相信其可读性

int index = 0;

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

可能对最初的问题海报没有帮助,因为这是他们试图避免的实际情况,但可能有助于其他人寻找简单的答案。

我不知道这是你想要的吗

List keys = new ArrayList(map.keySet());
int index = keys.indexOf(element);

你需要它做什么?正如答案中提到的,映射中的顺序不一定是恒定的,当添加或删除键时,它可能会发生变化。更好的是,两个相等的哈希映射仍然可以具有不同的顺序。即使他们有相同的添加/删除历史记录,他们也可以这样做(不同的能力可以做到)。如果OP真的想要这样做,那么编写一个由树集和映射支持的集合并不困难。这样,您可以始终以相同的顺序获得结果。现在,当映射在迭代过程中被修改时,如何表现取决于OP,但是一个数据结构是一个映射,其中键位于一个有序的集合中,这是绝对可行的。(顺便说一句,我更多的是评论你的答案,而不是OP的问题)。这个答案是错误的。虽然集合本身是未排序的,但LinkedHashMap确实保持了插入顺序,因此在迭代时,可以将其索引为based,或者类似地:
int index=0;对于(Object key:map.keySet()){
Object value=map.get(key);++index;}//dang格式顺序可能并不重要-例如,我们可能只需要测试第一个或最后一个读取对。在这种情况下,推荐的数据结构是什么?但是LinkedHashMap会这样做
List keys = new ArrayList(map.keySet());
int index = keys.indexOf(element);