Scott Hanselman распознавание речи использования вполне немного .
для каждого - это просто синтаксический сахар для версии итератора, и если вы проверите скомпилированный байт-код , то вы заметите, что компилятор фактически изменил его на версию итератора.
С формой для каждого вы не можете проверить, будет ли у вас больше элементов или нет. Просто оставайтесь с явным использованием итератора, если вам нужна эта функция.
Как говорили другие - это невозможно.
Просто помните, что конструкция foreach - это еще не все. Он был введен, чтобы упростить обозначение очень распространенной задачи выполнения одних и тех же операций над каждым элементом коллекции .
В вашем случае вы не хотите делать одно и то же с каждым элементом element - и, следовательно, цикл foreach не подходит для работы. Глупо пытаться "взломать" его для этого, просто используйте явный итератор в классическом цикле for.
Если вы хотите использовать for-each, возможно, что-то вроде этого:
if (objectList.indexOf(current)==objectList.size()-1) break;
Цикл 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
К сожалению, для каждой идиомы нельзя проверить, элемент является первым или последним в списке. Это известное ограничение для каждого цикла. Я предлагаю вам просто продолжать использовать итератор.
Если вы также можете проверить первый элемент вместо последнего, например, если вы выполняете конкатенацию строк, вы можете изменить что-то вроде:
boolean first = true;
for (Element e : list) {
if (!first) {
//do optional operation
}
//do other stuff
first = false;
}
но я бы предпочитаю использовать итератор.
В дополнение к ответу Луно:
Iterator<MyClass> it = myCollection.iterator();
while(it.hasNext()) {
MyClass myClass = it.next():
// do something with myClass
}
переводится как
for (MyClass myClass:myCollection) {
// do something with myClass
}
int nElts = objectList.size();
int n = 0;
for (...) {
if (++n == nElts) ...
- лучшее, что я могу придумать.
Есть два возможных случая, когда вы захотите это сделать.
для (Элемент объекта: theLinkedList) {
}
System.out.println ("что-то особенное")
вам необходимо каким-либо образом изменить последний элемент или использовать информацию, относящуюся к последнему элементу. В этом случае вы должны использовать ** LinkedList ** для доступа к последнему элементу
for(Object item:theLinkedList){
}
Object last=theLinkedList.getLast();
System.out.println("last");