Java 通用for循环:有没有一种方法可以获取迭代信息?

Java 通用for循环:有没有一种方法可以获取迭代信息?,java,loops,Java,Loops,我习惯于使用以下泛型实现循环: for (final Dog lDog : lAllDog) { ... } for (int i = 0 ; i < lAllDog.length(); i++) { System.out.println(i); } 不幸的是,对于另一个业务案例,我需要迭代的当前计数。 我知道我可以通过编写这样的代码来解决这个问题: for (final Dog lDog : lAllDog) { ... } for (int i = 0 ; i

我习惯于使用以下泛型实现循环:

for (final Dog lDog : lAllDog) {
   ...
}
for (int i = 0 ; i < lAllDog.length(); i++) {
   System.out.println(i);
}
不幸的是,对于另一个业务案例,我需要迭代的当前计数。 我知道我可以通过编写这样的代码来解决这个问题:

for (final Dog lDog : lAllDog) {
   ...
}
for (int i = 0 ; i < lAllDog.length(); i++) {
   System.out.println(i);
}
但是,有没有一种方法可以在不声明新的
int
或更改整个循环头的情况下,使用我的第一个代码示例获取当前迭代计数


Thx很多

简单地说,没有。你必须使用索引方法来做这件事。

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

否。增强的for循环不包含索引。如果你想要的话,你得自己介绍一下


原因是它基于接口。本质上,它使用迭代器在集合中循环。

否,如果列表中有唯一的元素

也许你可以试试这个

for (final Dog lDog : lAllDog) {

 int i=  lAllDog.indexOf(lDog);
}

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

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);
类索引
整数指数;
T值;
静态Iterable索引(Iterable Iterable){…}
用于(索引idog:索引(狗))
打印(idog.索引);
打印(idog.值);
在Java8中,我们可能希望将此控制模式抽象为

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);
forEach(狗,(索引,狗)->{
打印(索引);
印刷品(狗);
});
静态void forEach(Iterable集合,Acceptor-Acceptor){…}
接口接受器
无效接受(int索引,T值);

增强型for循环没有计数器-因此您需要以某种方式引入计数器。您的两个示例几乎涵盖了可能性…我认为增强的for循环专门用于一些特定的、非常简单的、非常常见的情况。我用它来做这些。除此之外,旧的For循环没有任何问题。@PatriciaShanahan增强的For循环在引擎盖下使用了一个
迭代器
,这意味着它以最佳速率遍历所有集合。“旧的
for
循环”有两个问题-它无法遍历
,如果您尝试遍历
链接列表
,则会导致糟糕的性能。@bmorris591任何增强的for循环都会扫描数组或Iterable。可以通过int索引高效地扫描数组。Iterable具有返回迭代器的迭代器()方法,因此可以由基于显式迭代器的basic for语句进行扫描。重要的是要记住,basic for语句不必完全基于索引-在适当的情况下,这是一个选项。请注意,这会将您的算法从
O(n)
移动到
O(n^2)
@recursive刚刚提供的备选方案。感谢回复这不是一个好方法,因为
indexOf()
每次都会用O(n**2)循环遍历列表,使此代码变慢。@dsh我知道,并且已经告诉你,为什么要发布其他人已经发布的答案“否”,只是为了显示备选答案。感谢回复,尽管这是O(n^2),但肯定是正确的。你不应该对收藏的顺序做任何假设。只有indexOf()可以为您提供正确的索引。这是一个不错的解决方案,但对于我的要求,它看起来有点太大了。这仍然会使用问题中的一个代码片段,隐藏在
index()
方法中,并将对象数量增加一倍,因此,这似乎是一些不必要的开销。但是,如果您想经常这样做,这可能是值得的