для (Объектный объект: список) [Java] и индексный элемент

Есть ли способ заставить идентификатор элемента списка получить его позже через list.get(index)

при использовании

for(Object obj: o)

конструкция

Только определите локальный var и вручную постепенное увеличение его? Что-либо более простое?

5
задан Felix Kling 18 May 2010 в 14:24
поделиться

4 ответа

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

int idx = 0;
for (Object o : list) {
   ...
   idx++;
}

Это рискованно, поскольку break / continue заставит idx выйти из синхронизации. , поэтому используйте его нечасто и только тогда, когда тело является простым и состоит всего из нескольких строк.

Если элементы различны, List.indexOf также будет работать, хотя и в O (N) , и в этот момент вы можете рассмотреть вариант Set (неупорядоченный, но гарантированно отличный).


Следует также сказать, что иногда использование listIterator () также устраняет необходимость в явном индексе во время итерации.

ListIterator поддерживает операции добавить , установить и удалить .

Это еще одно явное преимущество List перед массивами в том, что касается механизма итерации.

8
ответ дан 18 December 2019 в 09:48
поделиться

Простой ответ - нет.

Лучшее, что я могу придумать, - это объединить итерацию и индексацию следующим образом:

int idx = 0;
for (Iterator<Object> it = list.iterator(); it.hasNext(); idx++) {
    Object o = it.next();
    // ...
}

Этот подход имеет то преимущество, что break и continue не испортят вычисления idx .

С другой стороны, если список является ArrayList , и вы хотите отслеживать индекс, вам, вероятно, лучше просто использовать вариант

for (idx = 0; idx < list.size(); idx++) {
    Object o = list.get(idx);
    // ...
}
5
ответ дан 18 December 2019 в 09:48
поделиться

Вам нужно использовать:

list.indexOf(o);

Документация находится здесь

@Eugene Я вижу, что вы упомянули в комментарии к другому ответу, что планируете хранить индекс объекта (в самом объекте?), это, вероятно, не очень хорошая идея, будьте очень осторожны, поскольку индекс объекта может измениться.

2
ответ дан 18 December 2019 в 09:48
поделиться

Этот вопрос сформулирован не очень хорошо , но насколько я могу судить, вы хотели бы найти положение определенного объекта в List , а затем получить его позже по этому индексу?

Сначала в общем, если вам известен объект , который вы ищете, вам не нужно искать его в списке , поскольку он у вас уже есть.

Тем не менее, вы можете легко сделать что-то вроде этого:

int index = -1;
for (int i = 0; i < list.size(); i++) {
  if (list.get(i).equals(myObject)) {
    index = i; 
    break;
  }
}

Но я бы еще раз взглянул на ваше приложение, чтобы определить, действительно ли это то, что вам необходимо сделать.

2
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: