2013-03-18 67 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

相關問題