Java,如何在“for each”循环中获取当前索引/键[重复]

Posted

技术标签:

【中文标题】Java,如何在“for each”循环中获取当前索引/键[重复]【英文标题】:Java, How do I get current index/key in "for each" loop [duplicate] 【发布时间】: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) 【参考方案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)

【讨论】:

整洁!另见***.com/questions/7167253/… 我也在想同样的事情。我也喜欢 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。

以上是关于Java,如何在“for each”循环中获取当前索引/键[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java 'for each' 循环是如何工作的?

如何循环 JSON 数据以获取所有对象的打印百分比值,使用 for each 或 other [重复]

SwiftUI 在 For Each 中获取下一个循环的值

java中for ..each 循环 的详细用法 举个例子

Java基础Java 增强型的for循环 for each

java中的for each循环