2009-10-08 5 views
2

Comment faire référence à l'index d'un tableau dans foreach?Référence au numéro d'itération dans Java foreach

Mon code

String[] name = { "hello", "world" }; 
for (int k : name[k]) { 
    --- cut --- 
} 

J'attends que le foreach -loop se

1. set k = 0 in first iteration so that name[0] works correctly 
2. set k = 1 in the next iteration... 

je reçois le message d'erreur

foreach pas applicable type d'expression

+2

Pouvez-vous fournir plus d'informations sur les raisons pour lesquelles vous pensez avoir besoin d'un index? Est-ce que vous faites vraiment quelque chose qui dépend de la position, ou faites-vous simplement quelque chose avec chaque chaîne dans le tableau? –

Répondre

15

C'est parce que l'indice n'est pas disponible lorsque vous utilisez la syntaxe foreach. Vous devez utiliser traditionnelle itération si vous avez besoin de l'index:

for (int i =0; i < names.length; i++) { 
    String name = names[i]; 
} 

Si vous n'avez pas besoin l'indice, la norme foreach suffira:

for (String name : names) { 
    //... 
} 

EDIT: évidemment vous pouvez obtenir l'index en utilisant un compteur, mais alors vous avez une variable disponible en dehors de la portée de la boucle, ce qui je pense est indésirable

+0

Dans votre deuxième paragraphe, je pense que vous vouliez écrire * index * not * syntax *. –

+0

La première boucle for ne sera pas avec une collection non-indexée. –

+0

@Steve: oui ... mais la question concerne un tableau, pas une collection. –

3

Le seul moyen serait de vous suivre avec un compteur.

int cnt = 0; 
String[] names = new String[10]; 
for (String s : names) { 
    ...do something... 
    cnt++; 
} 
+1

Meilleure réponse.Fondamentalement, vous ne pouvez pas, mais il n'y a aucun problème à créer votre propre compteur. – Kibbee

+5

Si vous voulez un compteur, ne seriez-vous pas mieux d'utiliser une boucle normale? – ColinD

+0

@ColinD - c'est un toss up, mais je trouve les boucles foreach plus faciles à lire en général. – Gandalf

1

Non, vous ne pouvez pas faire cela. Dans une instruction for-enhanced, vous ne pouvez itérer que sur un Iterable. Vous ne pouvez rien faire d'autre à l'intérieur.

2

Avec votre exemple, la boucle foreach doit être utilisé comme celui-ci (le pluriel est names un meilleur nom pour un tableau de noms de name):

String[] names = { "hello", "world" }; 
for (String name : names) { 
    // do something with the name 
} 
1

Vous n'avez pas besoin d'un compteur. Il suffit de faire

String[] name = { "hello", "world" }; 
for (String s : name) { 
    --- cut --- 
    System.out.println(s); 
    --- cut --- 
} 

qui sortira

hello 
world 
0

Votre aide de la pour chaque boucle de manière incorrecte. Il vous donne automatiquement une référence à chaque élément dans ce que vous itérez, et il faut indexer. La bonne façon, dans ce cas, serait le suivant:

String[] name = {"hello", "world"}; 
for(String s : name){ 
    System.out.println(s); 
} 

Si vous avez besoin de plus de flexibilité dans l'accès aux éléments d'un objet itérable, vous pouvez utiliser directement l'itérateur. Les tableaux ne fournissent pas d'itérateurs, j'ai donc utilisé une liste ici.

List<String> name = Arrays.asList(new String[]{"hello", "world"}); 

for(Iterator<String> it = name.iterator(); it.hasNext();){ 
    String currentName = it.next(); 
    System.out.println(currentName); 
    it.remove(); 
}