【问题标题】:Java, How do I get current index/key in "for each" loop [duplicate]Java,如何在“for each”循环中获取当前索引/键[重复]
【发布时间】:2011-03-26 18:46:46
【问题描述】:

在 Java 中,如何获取 Java 中元素的当前索引?

for (Element song: question){
    song.currentIndex();         //<<want the current index.
}

在 PHP 中你可以这样做:

foreach ($arr as $index => $value) {
    echo "Key: $index; Value: $value";
}

【问题讨论】:

  • 这个问题大约每月被问一次
  • 在 PHP 中,您使用的关联数组不是 Java 数组的同义词。
  • Arrays.asList(question).indexOf(song)

标签: java


【解决方案1】:

你不能,你要么需要单独保存索引:

int index = 0;
for(Element song : question) {
    System.out.println("Current index is: " + (index++));
}

或使用普通的 for 循环:

for(int i = 0; i < question.length; i++) {
    System.out.println("Current index is: " + i);
}

原因是您可以使用精简的 for 语法来遍历任何 Iterable,并且不能保证这些值实际上具有“索引”

【讨论】:

  • 这在语义上确实是正确的答案,因为每个循环都可以遍历来自远程数据库的流数据,当您迭代其内容时(如果使用的迭代器确实这样做),该远程数据库正在更新在这种情况下,无法知道当前索引。索引只是数据的视图,而不是数据的属性。
  • 虽然它可能没有索引,但拥有某种可以在循环内访问的迭代计数器会非常方便。我想这样的事情很难在核心 java 中结束,一些脚本语言的机会更多。
  • 正如我所担心的,也许在 Java 12 中他们会添加它作为一项值得骄傲的功能,就像他们最近对 lambdas 和使用单行读取文件所做的那样? (免责声明:我自己(主要)是一名 Java 程序员)
  • @atas 距离 Java 12 近 2.5 年...如果您正在处理数组,该索引肯定是可用的,即它在堆栈上。如果有一个关键字可以编译为简单的“ILOAD 2”,那将是非常酷的。如果它是一个 List,它会编译成一个迭代器,它不能给你一个索引。
【解决方案2】:

在 Java 中,您不能,因为 foreach 旨在隐藏迭代器。您必须执行正常的 For 循环才能获得当前迭代。

【讨论】:

    【解决方案3】:

    跟踪您的索引:这就是它在 Java 中的完成方式:

     int index = 0;
        for (Element song: question){
            // Do whatever
             index++;
        }
    

    【讨论】:

    • 确实如此,但尽管我非常喜欢 Java5 中引入的增强型 for-each 循环,但提供您自己的索引不会破坏简单地使用传统 for-each 构造的目的吗?对于 Java 开发人员来说,使用 Java 内置的内容通常会更直观/更易读(但并非总是如此)。
    • 7 年后......(哇,我简直不敢相信,时间过得真快),我同意你@MichaelM 100%。
    【解决方案4】:

    在 Java 中不可能。


    这是 Scala 的方式:

    val m = List(5, 4, 2, 89)
    
    for((el, i) <- m.zipWithIndex)
      println(el +" "+ i)
    

    【讨论】:

    • 我也在想同样的事情。我也喜欢 Javascript 语法:myArray.forEach((val, index) =&gt; console.log('VAL : ', val, 'INDEX : ', index) );
    • 问题是关于 Java,而不是 JVM:抱歉,scala 超出了范围。
    【解决方案5】:

    正如其他人指出的那样,“不可能直接”。 我猜你想要 Song 的某种索引键? 只需在 Element 中创建另一个字段(成员变量)。将歌曲添加到集合时增加它。

    【讨论】:

      【解决方案6】:

      我正在使用的当前代码示例:

      int index=-1;
      for (Policy rule : rules)
      {   
           index++;
           // do stuff here
      }
      

      让您从零索引开始,并在处理过程中递增。

      【讨论】:

      • 简单的麻烦。从零开始,最后实施。除非你在循环体中使用 continue。
      猜你喜欢
      • 2016-08-21
      • 1970-01-01
      • 2012-09-27
      • 2013-03-19
      • 1970-01-01
      • 2015-09-15
      • 2021-05-23
      • 2013-04-10
      • 1970-01-01
      相关资源
      最近更新 更多