Java: Альтернатива iterator.hasNext () при использовании для - каждый для цикличного выполнения по набору

Scott Hanselman распознавание речи использования вполне немного .

16
задан Dan Burzo 23 November 2009 в 12:41
поделиться

8 ответов

для каждого - это просто синтаксический сахар для версии итератора, и если вы проверите скомпилированный байт-код , то вы заметите, что компилятор фактически изменил его на версию итератора.

С формой для каждого вы не можете проверить, будет ли у вас больше элементов или нет. Просто оставайтесь с явным использованием итератора, если вам нужна эта функция.

21
ответ дан 30 November 2019 в 16:50
поделиться

Как говорили другие - это невозможно.

Просто помните, что конструкция foreach - это еще не все. Он был введен, чтобы упростить обозначение очень распространенной задачи выполнения одних и тех же операций над каждым элементом коллекции .

В вашем случае вы не хотите делать одно и то же с каждым элементом element - и, следовательно, цикл foreach не подходит для работы. Глупо пытаться "взломать" его для этого, просто используйте явный итератор в классическом цикле for.

4
ответ дан 30 November 2019 в 16:50
поделиться

Если вы хотите использовать for-each, возможно, что-то вроде этого:

if (objectList.indexOf(current)==objectList.size()-1) break;
0
ответ дан 30 November 2019 в 16:50
поделиться

Цикл foreach (или расширенный для цикл) не имеет средств для отслеживания того, какой элемент повторяется в данный момент. Невозможно узнать, над каким индексом коллекции ведется работа, и есть ли еще элементы, которые нужно обработать в Iterable .

Тем не менее, есть одно временное решение. это будет работать, так это сохранить ссылку на объект, который в данный момент повторяется в цикле foreach .

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

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

Например:

String lastString = null;

for (String s : new String[] {"a", "b", "c"}) {
    // Do something.

    // Keep the reference to the current object being iterated on.
    lastString = s;
}

System.out.println(lastString);

Вывод:

c
2
ответ дан 30 November 2019 в 16:50
поделиться

К сожалению, для каждой идиомы нельзя проверить, элемент является первым или последним в списке. Это известное ограничение для каждого цикла. Я предлагаю вам просто продолжать использовать итератор.

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

boolean first = true;
for (Element e : list) {
  if (!first) {
    //do optional operation
  }
  //do other stuff
  first = false;
}

но я бы предпочитаю использовать итератор.

1
ответ дан 30 November 2019 в 16:50
поделиться

В дополнение к ответу Луно:

Iterator<MyClass> it = myCollection.iterator();
while(it.hasNext()) {
  MyClass myClass = it.next():
  // do something with myClass
}

переводится как

for (MyClass myClass:myCollection) {
  // do something with myClass
}
8
ответ дан 30 November 2019 в 16:50
поделиться
int nElts = objectList.size();
int n = 0;
for (...) {
  if (++n == nElts) ...

- лучшее, что я могу придумать.

0
ответ дан 30 November 2019 в 16:50
поделиться

Есть два возможных случая, когда вы захотите это сделать.

    Вам нужно что-то сделать после того, как будет достигнут последний элемент: в этом случае вам просто нужно вывести свой код за пределы цикла.
    
      для (Элемент объекта: theLinkedList) {
    
     }
     System.out.println ("что-то особенное")
    
    вам необходимо каким-либо образом изменить последний элемент или использовать информацию, относящуюся к последнему элементу. В этом случае вы должны использовать ** LinkedList ** для доступа к последнему элементу

    for(Object item:theLinkedList){

    }
    Object last=theLinkedList.getLast();
    System.out.println("last");
0
ответ дан 30 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

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