2010-08-07 81 views
168

在Java中,如何获取Java中元素的当前索引?Java,我如何获得当前的索引/键在“for each”循环中

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

在PHP中,你可以这样做:

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

这会被问到一个月一次 – 2010-08-07 20:58:47

+0

在PHP中,您使用的不是同义Java数组的关联数组。 – squiguy 2013-01-03 01:36:34

回答

238

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

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

或使用正常的循环:

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

的原因是,你可以使用浓缩的语法循环遍历任何Iterable,并且不能保证这些值实际上有一个“索引”

+2

这在语义上的确是正确的答案,因为每个循环都可以迭代来自远程数据库的流数据,在迭代其内容的同时正在更新远程数据库(如果使用的迭代器实际上是这样做的),在这种情况下无法知道目前的指数。索引只是对数据的*查看*,而不是数据的属性。 – Esko 2010-08-07 18:26:32

+1

虽然它可能不是索引,但在循环内部可以访问某种迭代计数器会非常方便。我猜这样的事情很难在核心Java中结束,对于某些脚本语言来说更多的机会。 – akostadinov 2013-04-01 11:11:05

+0

正如我担心的那样,也许在Java 12中,他们会将它添加为一个值得引以为傲的功能,就像他们最近使用lambdas并使用单行程序读取文件一样? (免责声明:我(大部分)是我自己的Java程序员) – atas 2014-12-18 12:37:39

12

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

11

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

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

的确如此,但尽管我喜欢在Java5中引入的增强型for-each循环,但是不会提供您自己的索引而仅仅使用传统for-each构造的目的?使用Java内置的内容通常对Java开发人员来说更直观/可读(尽管并非总是)。 – 2017-06-11 19:39:55

+1

7年后...(哇,我不能相信它,时光飞逝),我同意你@MichaelM 100%。 – 2017-06-12 18:16:36

6

在Java中不可能。


这里是Scala的方式:

val m = List(5, 4, 2, 89) 

for((el, i) <- m.zipWithIndex) 
    println(el +" "+ i) 
+0

整洁!另见https://stackoverflow.com/questions/7167253/is-there-a-java-equivalent-of-pythons-enumerate-function – 2015-02-25 12:48:40

1

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

21
for (Song s: songList){ 
    System.out.println(s + "," + songList.indexOf(s); 
} 

它可能在链接列表中。

你必须在song类中做toString()。 如果你不打印它会打印出歌曲的参考。

现在可能无关紧要。^_ ^从当前的代码

+0

真棒!好主意 – 2014-08-03 00:10:08

+9

丑陋的黑客...... – Pacerier 2014-08-08 00:15:01

+40

正如人们评论http://stackoverflow.com/a/5200217,如果有重复的元素,并且是O(n²)慢,这是错误的。 – 2015-02-25 12:45:39

-3

实例我的工作:

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

让您用干净的零指标,增量开始为您处理。

+0

简单繁琐。从零开始并在最后执行。除非你在循环体中继续使用。 – gabor 2017-06-12 11:32:16