2010-05-18 2 views
4

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

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

for(Object obj: o) 

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

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

+2

Вы ответили на него. –

ответ

7

Нет, 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 имеет над массивами до тех пор, пока идет итерационный механизм.

2

Этот вопрос не сформулирован очень хорошо, но из того, что я могу сказать, вы хотели бы найти позицию определенного 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; 
    } 
} 

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

+0

Мне просто нужно сохранить позицию в списке в поле каждого объекта. o.setPosInList (currentIndexOfTheLoop) – EugeneP

+1

@EugeneP: тогда подсчет, вероятно, лучший способ ... –

5

Простой ответ No.

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

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

Вы должны использовать:

list.indexOf(o); 

документация here

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

+0

, учитывая его пример кода, это будет o.indexOf (obj); –

+0

мой ответ однако разумный. и, что более важно, обеспечивает связь с более образованными и другими. если кто-то с представителем может отредактировать вопрос более разумным, это было бы здорово. – Justin

+0

Джастин, я собирался понизить ваш ответ, но я не буду :-) - Но это худшее возможное решение этой проблемы, главным образом потому, что если вы поддерживаете индексную переменную, время, необходимое для вычисления позиции в индексе будет O (1), просто время, необходимое для увеличения переменной. При вашем подходе время O (n), где «n» - это позиция элемента в списке. –

Смежные вопросы