5

我习惯于用这样的泛型实现循环:

for (final Dog lDog : lAllDog) {
   ...
}

不幸的是另一个业务案例我需要迭代的当前计数。我知道我可以通过编写类似的代码来解决这个问题:

for (int i = 0 ; i < lAllDog.length(); i++) {
   System.out.println(i);
}

或者

int i = 0;
for (final Dog lDog : lAllDog) {
   ...
   i++;
}

但是有没有办法用我的第一个代码示例获取当前的迭代计数,而无需声明新的int或更改整个循环头?

多谢

4

5 回答 5

5

简而言之,没有。您必须使用索引方法来做到这一点。

于 2013-03-18T16:17:14.790 回答
1

不,除了您在问题中描述的以外,没有其他方法可以计算迭代次数。您必须使用旧方法来定义计数器

于 2013-03-18T16:20:21.390 回答
1

不,增强的 for 循环不包含索引。如果你想要一个,你必须自己介绍它。

原因是它基于Iterable接口。本质上,它使用一个迭代器来循环一个集合。

于 2013-03-18T16:20:31.693 回答
1

不,如果您的列表有独特的元素

也许你可以试试这个

for (final Dog lDog : lAllDog) {

 int i=  lAllDog.indexOf(lDog);
}
于 2013-03-18T16:21:08.970 回答
1

他们说计算机科学中的每一个问题都可以通过更间接的方式来解决

class Indexed<T>
    int index;
    T value;

static <T> Iterable<Indexed<T>> indexed(Iterable<T> iterable){ ... }

for(Indexed<Dog> idog : indexed(dogs))
    print(idog.index);
    print(idog.value);

在 java 8 中,我们可能希望将这种控制模式抽象为

forEach(dogs, (index, dog)->{ 
    print(index);
    print(dog);
});

static <T> void forEach(Iterable<T> collections, Acceptor<T> acceptor){...}

interface Acceptor<T>
    void accept(int index, T value);
于 2013-03-18T16:23:06.277 回答