【问题标题】:Java - get index of key in HashMap?Java - 获取HashMap中的键索引?
【发布时间】:2011-02-10 18:44:37
【问题描述】:

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

基本上,当我遍历地图时,我希望能够获得 0,1,2...我认为这比声明一个 int 并在每次迭代中递增更清晰。

谢谢。

【问题讨论】:

  • 你需要它做什么?正如答案中提到的,地图中的顺序不一定是恒定的,它可以在添加或删除键时改变。
  • 更好的是,两个相等的 HashMap 仍然可以有不同的排序。他们可以做到这一点即使他们有相同的添加/删除历史(不同的能力会做到这一点)。

标签: java iteration hashmap


【解决方案1】:

使用 LinkedHashMap 代替 HashMap 调用 keySet() 时,它总是以相同的顺序(与插入)返回键

更多详情请见Class LinkedHashMap

【讨论】:

  • 顺序可能并不重要 - 例如,我们可能只需要测试第一个或最后一个读取对。
【解决方案2】:

不确定这是否是任何“更清洁”,但是:

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

【讨论】:

  • 或类似:int index = 0; for (Object key : map.keySet()) { Object value = map.get(key); ++索引; } // dang 格式
【解决方案3】:

HashMap 没有定义键的顺序。

【讨论】:

  • 但是 LinkedHashMap 可以
【解决方案4】:

如果您想要做的只是从 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
}

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 如果 OP 真的想要这个,编写一个由 TreeSet 和 Map 支持的集合并不难。这样您就可以始终以相同的顺序获得结果。现在关于在迭代期间修改 Map 时的行为取决于 OP,但是作为键位于有序集中的映射的数据结构绝对是可行的。 (顺便说一句,我对您的回答的评论比对 OP 的问题的评论更多)。
    • 这个答案是错误的。虽然集合本身是未排序的,但 LinkedHashMap 确实保持了插入顺序,因此在迭代时可以使其基于索引
    【解决方案6】:

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

    【讨论】:

    • 这种情况下推荐的数据结构是什么?
    【解决方案7】:

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

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

    可能对最初的问题发布者没有帮助,因为这是他们试图避免的字面情况,但可能会帮助其他人寻找简单的答案。

    【讨论】:

      【解决方案8】:

      我最近在学习 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  
        }
      

      【讨论】:

        【解决方案9】:

        我不知道这是你要找的东西

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

        【讨论】:

          猜你喜欢
          • 2011-04-27
          • 1970-01-01
          • 1970-01-01
          • 2016-04-22
          • 2015-05-12
          • 2012-08-07
          • 2010-11-25
          • 2016-03-08
          相关资源
          最近更新 更多