Ссылка на номер итерации в foreach Java - PullRequest
3 голосов
/ 09 октября 2009

Как вы можете ссылаться на индекс массива в foreach?

Мой код

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

Я ожидаю, что цикл foreach будет

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

Я получаю сообщение об ошибке

foreach не относится к типу выражения

Ответы [ 6 ]

16 голосов
/ 09 октября 2009

Это потому, что индекс недоступен при использовании синтаксиса foreach. Вы должны использовать традиционную итерацию, если вам нужен индекс:

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

Если вам не нужен индекс, стандартного foreach будет достаточно:

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

РЕДАКТИРОВАТЬ : очевидно, что вы можете получить индекс с помощью счетчика, но тогда у вас есть переменная, доступная за пределами цикла, что я считаю нежелательным

3 голосов
/ 09 октября 2009

Единственный способ - следить за счетчиком.

int cnt = 0;
String[] names = new String[10];
for (String s : names) {
   ...do something...
   cnt++;
}
2 голосов
/ 09 октября 2009

В вашем примере цикл foreach должен использоваться следующим образом (множественное число names является лучшим именем для массива имен, чем name):

String[] names = { "hello", "world" };
for ( String name : names ) {
   // do something with the name
}
1 голос
/ 09 октября 2009

Вам не нужен счетчик. Просто сделай

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

Который выдаст

hello
world
1 голос
/ 09 октября 2009

Нет, вы не можете этого сделать. Внутри расширенного оператора for вы можете выполнять итерации только по Iterable . Вы не можете больше ничего делать внутри.

0 голосов
/ 09 октября 2009

Вы используете неправильно для каждого цикла. Он автоматически дает вам ссылку на каждый элемент в том, что вы перебираете, и здесь нужно индексировать. В этом случае правильный путь будет следующим:

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

Если вам требуется больше гибкости в доступе к элементам итерируемого объекта, вы можете использовать итератор напрямую. Массивы не предоставляют итераторов, поэтому я использую список здесь.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...