java foreach пропустить первую итерацию - PullRequest
49 голосов
/ 19 апреля 2011

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

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

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

Ответы [ 11 ]

59 голосов
/ 19 апреля 2011

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

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

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

52 голосов
/ 02 августа 2014

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

cars.stream().skip(1) // and then operations on remaining cars
28 голосов
/ 21 августа 2013

Использование гуавы Iterables.skip().

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

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

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

26 голосов
/ 19 апреля 2011
for (Car car : cars)
{
   if (car == cars[0]) continue;
   ...
}

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

18 голосов
/ 19 апреля 2011

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

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

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

6 голосов
/ 19 апреля 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 : При ближайшем рассмотрении я вижу, что Гуава имеет здесь Iterables.skip(...) .

4 голосов
/ 19 апреля 2011

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

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

1 голос
/ 17 августа 2016

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

int counter = 0;
for ( Car car : cars ) {
    //skip if first, do work for rest
    if(counter>0){
        //do something
    }
    counter++;
}
1 голос
/ 03 июня 2014

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

Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext()){
    rows.next();
}
for (; rows.hasNext();) {
    XXXXX row = (XXXXX) rows.next();
}
1 голос
/ 19 апреля 2011

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

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

...