java foreach пропустить первую итерацию

Есть ли элегантный способ пропустить первую итерацию в цикле foreach Java5?

Пример псевдокода:

for ( Car car : cars ) {     
   //skip if first, do work for rest
   .
   .
}

person Amir Afghani    schedule 18.04.2011    source источник
comment
Для справки, Java5 не новинка уже 5-6 лет.   -  person cHao    schedule 19.04.2011
comment
Я подозреваю, что это то, для чего цикл foreach явно не предназначен.   -  person Owen    schedule 19.04.2011
comment
Думаю, я должен был сказать новее :P   -  person Amir Afghani    schedule 19.04.2011


Ответы (11)


Я бы не назвал это элегантным, но, возможно, лучше, чем использование "первого" логического значения:

for ( Car car : cars.subList( 1, cars.size() ) )
{
   .
   .
}

Кроме этого, вероятно, нет элегантного метода.

person Sean Adkinson    schedule 18.04.2011
comment
Разве не все упорядоченные типы коллекций и массивы имеют такую ​​команду типа подмножества? - person RHSeeger; 19.04.2011
comment
@RHSeeger Нет, я так не думаю. Я имею в виду, единственное, что делает список списком, это тот факт, что он упорядочен, так как же указать границы подмножества неупорядоченной коллекции? Я предполагаю, что вы можете пропустить первую итерацию Iterator, но не будет никакой гарантии, что вы всегда будете пропускать один и тот же первый элемент. - person Sean Adkinson; 19.04.2011
comment
Был еще один кронштейн :) - person Bakudan; 18.09.2012

С новым Java 8 Stream API он действительно становится очень элегантным. Просто используйте метод skip():

cars.stream().skip(1) // and then operations on remaining cars
person Kao    schedule 02.08.2014

Используйте Guava Iterables.skip().

Что-то вроде:

for ( Car car : Iterables.skip(cars, 1) ) {     
    // 1st element will be skipped
}

(Получил это из конца ответа msandiford и хотел сделать его отдельным ответом)

person yop83    schedule 21.08.2013

for (Car car : cars)
{
   if (car == cars[0]) continue;
   ...
}

Достаточно элегантно для меня.

person elekwent    schedule 19.04.2011
comment
Мне кажется, что так понятнее... и, по-видимому, намного быстрее в большом списке? - person noelicus; 27.04.2013
comment
Если только один элемент не повторяется, но +1 за элегантность. - person borjab; 04.03.2014
comment
Фу. Добавлять ненужное условие к каждой итерации цикла? Спасибо, не надо. - person Andrew; 24.01.2017

В коде SeanA есть крошечная ошибка: второй аргумент sublist обрабатывается как эксклюзивный индекс, поэтому мы можем просто написать

for (Car car : cars.subList(1, cars.size()) {
   ...
}

(Кажется, я не могу комментировать ответы, отсюда и новый ответ. Нужна ли мне для этого определенная репутация?)

person Daniel Lubarov    schedule 19.04.2011
comment
Теперь у вас должна быть возможность комментировать. - person Ishtar; 19.04.2011

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

public static <T> Iterable<T> skipFirst(final Iterable<T> c) {
    return new Iterable<T>() {
        @Override public Iterator<T> iterator() {
            Iterator<T> i = c.iterator();
            i.next();
            return i;
        }
    };
}

И используйте его примерно так:

public static void main(String[] args) {
    Collection<Integer> c = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    for (Integer n : skipFirst(c)) {
        System.out.println(n);
    }
}

Обобщение, чтобы пропустить "n", оставлено в качестве упражнения для читателя :)


EDIT: при ближайшем рассмотрении я вижу, что у Guava есть Iterables.skip(...) здесь.

person clstrfsck    schedule 19.04.2011

Я не человек Java, но вы можете использовать:

for ( Car car : cars.tail() ) из java.util через Groovy JDK

person Preet Sangha    schedule 18.04.2011
comment
Предполагается ли, что автомобили - это Список? - person Piyush Mattoo; 19.04.2011

Не так элегантно, но работайте с итераторами

Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext()){
    rows.next();
}
for (; rows.hasNext();) {
    XXXXX row = (XXXXX) rows.next();
}
person Angel    schedule 03.06.2014

Элегантный? Не совсем. Вам нужно будет проверить/установить логическое значение.

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

person Brian Roach    schedule 18.04.2011

Это может быть не очень элегантно, но можно инициализировать целочисленную переменную вне цикла for и увеличивать ее при каждой итерации внутри цикла. Ваша программа будет выполняться только в том случае, если счетчик больше 0.

int counter = 0;
for ( Car car : cars ) {
    //skip if first, do work for rest
    if(counter>0){
        //do something
    }
    counter++;
}
person Benjamin    schedule 17.08.2016

Вы можете использовать счетчик. Хотя кодирование не такое зрелое, я считаю, что это самый простой способ пропустить первый элемент из списка.

    int ctr=0;
    for(Resource child:children) {
    if(ctr>0) { //this will skip the first element, i.e. when ctr=0
    //do your thing from the 2nd element onwards
    }
    ctr++;
    }
person Sonakshi Sharma    schedule 16.01.2019