for (объектный объект: список) [java] и индексный элемент - PullRequest
5 голосов
/ 18 мая 2010

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

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

for(Object obj: o)

строительство

Определить только локальную переменную и вручную увеличивать ее? Что-нибудь попроще?

Ответы [ 4 ]

8 голосов
/ 18 мая 2010

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

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

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

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


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

A ListIterator поддерживает операции add, set и remove.

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

5 голосов
/ 18 мая 2010

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

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

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

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

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

for (idx = 0; idx < list.size(); idx++) {
    Object o = list.get(idx);
    // ...
}
2 голосов
/ 18 мая 2010

Вам необходимо использовать:

list.indexOf(o);

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

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

2 голосов
/ 18 мая 2010

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

Прежде всего, если вы знаете Object, который вы ищете, вам не нужно искать его в List, так как он у вас уже есть.

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

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

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

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