2013-03-18 69 views
5

我用来实现与这样的泛型循环:泛型for-loop:有没有办法获得迭代信息?

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

Unfortunality另一个商业案例,我需要迭代的当前计数。 我知道我可以通过编码的财产以后这样的解决这个问题:

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

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

但有没有办法让我的第一个代码示例迭代的当前计数没有宣布新的int或更改整个循环标题?

Thx很多

+4

增强的for循环没有计数器 - 所以您需要引入计数器,这种或那种方式。你的两个例子几乎涵盖了可能... – assylias 2013-03-18 16:17:33

+0

我认为增强型for-loop是专门针对一些特定的,非常简单的,非常常见的情况。我用它来做那些。对于其他任何事情,旧的for循环都没有错。 – 2013-03-18 16:20:40

+0

@PatriciaShanahan增强型for循环在引擎盖下使用了'Iterator',这意味着它以最优的速度遍历所有集合。 “''''''循环'有两个问题 - 它不能遍历一个'Set',如果你试图遍历一个'LinkedList',那么最终会导致可怕的性能。 – 2013-03-18 16:26:12

回答

5

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

1

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

1

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

原因是因为它基于Iterable接口。实际上,它使用迭代器来循环访问集合。

1

没有,如果你的列表中有独特的元素

可能是你可以试试这个

for (final Dog lDog : lAllDog) { 

int i= lAllDog.indexOf(lDog); 
} 
+3

请注意,这会将您的算法从'O(n)'移动到'O(n^2)'。 – recursive 2013-03-18 16:23:02

+0

@recursive只是提供了替代方法。谢谢回复 – Pragnani 2013-03-18 16:23:51

+0

这不是一个好的方法,因为每次使用O(n ** 2)使该代码变慢时,indexOf()将迭代整个列表。 – dsh 2013-03-18 16:25:35

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); 
+0

不错的解决方案,但看起来有点超大我的要求。 – 2013-03-18 16:24:17

+0

这仍然会使用隐藏在'indexed()'方法中的问题中的代码片断之一,并且将对象数量加倍,所以看起来像是一些不必要的开销。 – jlordo 2013-03-18 16:26:37

+0

这可能是值得的,如果你想这样做很多,但是 – 2013-03-18 16:33:26

相关问题