для (Объект объект: список) [Java] строительство - PullRequest
1 голос
/ 18 мая 2010

Мой вопрос, будет ли последовательность элементов, выбранных из списка, всегда одинаковой,

является ли это поведение конструкции детерминированным для

           java "List"s - descendants of java.util.List

2) вопрос, если я использую

for(Object o: list)
конструкцию и внутри тела цикла увеличиваю переменную, это будет индекс элементов списка? Итак, как это проходит через элементы списка, от 0 до size () - 1 или хаотично?
                   List.get(i) 

всегда будет возвращать этот элемент?

3) вопрос (полагаю, на 2-й вопрос ответ будет отрицательным, поэтому:)

         for (int i=0; i < list.size(); i++) {
         }

- лучший способ, если мне нужно сохранить индекс элемента, а затем получить его из списка по его идентификатору?

Общий:

Мне просто нужно сохранить позицию в списке в поле каждого объекта.

        object.setPosInList(currentIndexOfTheLoop)

Теперь ясно?

Ответы [ 7 ]

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

Любой потомок List предоставит Iterator, который перебирает список в детерминированном правильном порядке.

Конструкция цикла for-each скомпилирована в код, который использует метод iterator(), который для List описан следующим образом в API:

Итератор

  public Iterator iterator()
Возвращает итератор для элементов в этом списке в правильной последовательности.

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

будет ли последовательность элементов, выбранных из списка, всегда одинаковой

Да. Цитата из API Javadoc :

Упорядоченная коллекция (также известная как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке каждый элемент вставлен. Пользователь может получить доступ к элементам по их целочисленному индексу (позиции в списке) и искать элементы в списке.

2

как он проходит через элементы списка, от 0 до size () - 1

Да.

3: Нет, вам обычно не нужно перебирать список вручную, чтобы добраться до индексированного элемента. Наиболее используемая реализация List - это ArrayList, которая представляет собой произвольный доступ, то есть вы можете получить доступ к любому из его элементов напрямую, в постоянное время. Для LinkedList, list.get(i) выполняет итерацию по списку до неявного желаемого элемента, поскольку эта реализация не является произвольным доступом.

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

1) Да

2) Да

3) Нет.

Также обратите внимание, что в LinkedLists использование get(i) - это O (i), в то время как получение следующего элемента от итератора (что и делает каждый) - O (1).

1 голос
/ 18 мая 2010

Также посмотрите на java.util.ListIterator.

List<Object> list = new ArrayList<Object>();
for(ListIterator<Object> it = list.listIterator(); it.hasNext(); )
{
  Object o = it.next();
  it.nextIndex();
  it.prevIndex(); // etc
}
1 голос
/ 18 мая 2010

Согласно договору API API List.iterator () :

Возвращает итератор для элементов в этом списке в правильной последовательности.

Так что да, итерация по элементам List должна происходить от индекса 0 до size () - 1. Теоретически, вы можете столкнуться с реализацией, которая нарушает контракт, но тогда это ошибка в реализации, а не в вашем коде.

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

@ MichaelBorgwardt Такая реализация будет нарушена - она ​​не удовлетворяет контракту для List.iterator.

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

for(Object o : list) неявно использует List Iterator, возвращая элементы в детерминированном порядке. for(int i = 0; i < list.size(); i++) также выбирает элементы из List в детерминированном порядке, так как по определению упорядочены List s.

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