2013-06-29 5 views
-4

Это, пожалуй, случайный и нерешительный вопрос, но в последнее время я много работаю над обработкой массивов в Java, и мне было интересно, следует ли при использовании следующего цикла:Доступ к индексу при итерации по массиву java для цикла

for (Object obj : SomeArrayOrCollection) { 
    //do something 
} 

, есть ли способ получить доступ к какому-то порядковый не делать то, что я обычно делаю (объявление дополнительные переменным и добавление одного к нему каждый раз, когда проходит цикл), или что один из моих коллег делает (используя

List.indexOf(int i) 

способ)? Я чувствую, что оба они добавляют довольно много накладных расходов. Я знаю, что я мог бы просто использовать стандартный

for (declaration;condition;change) { } 

цикл, но это значительно удобнее в контексте данного проекта, чтобы использовать модифицированный цикл. Итак, вопрос в том, есть ли способ получить доступ к индексу объекта, с которым вы работаете, не прибегая к более интенсивной работе с памятью, как у меня выше?

Спасибо!

+0

Здесь я не вижу никакой операции с интенсивной памятью – stinepike

+1

Да; это накладные расходы. Но «foreach» Java - это просто сахара поверх обычной конструкции 'for', поэтому вы боретесь с мнимой проблемой. Использовать для'. – tkroman

+0

Что такое интенсивная память? – zerocool

ответ

1

Если вы хотите Aceess index, то вы можете использовать

for (int i=0;i<SomeArrayOrCollection.length;i++) { 
    //Here i is the index 
} 

Используя для каждого вы не можете доступ к индексным

Причина заключается в том, что для-каждом цикл внутренне не имеет счетчика ; он основан на интерфейсе Iterable.

SEE HERE

0

Нет, нет. Не могли бы вы объяснить, почему стандарт для цикла настолько неудобен, если вам нужен индекс?

1

Модифицированный цикл был создан для простого доступа к коллекциям, таким как ArrayLists. Вы не можете использовать индекс по умолчанию в расширенном для цикла. Если вы хотите это сделать, вам придется либо использовать обычный цикл, то есть for(initialization; condition ; change), либо вы можете объявить переменную снаружи для цикла и увеличить ее внутри

+0

Это ни * модифицировано * ни * продвинутый *, но * усиленный *. –

+0

@MarkoTopolnik, спасибо за ваше предложение :). Я редактировал –

0

Фактически нет, я думаю, что вы обычно делаете, это правильно, делать. Использование indexOf определенно неверно, если реализация списка не поддерживается хэш-картой (чего я не ожидал).

3

No, for -Какие циклы не отслеживают, какой индекс они включены, поскольку не каждый Iterable является индексируемым. Большинство Set s, например, не имеют понятия порядка, поэтому нет смысла говорить, что «цикл находится на элементе с индексом n th». Если вы хотите отслеживать, что итерация, цикл включен, тогда вам нужно будет использовать счетчик, как вы предложили.