Подтвердить что ты не робот

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

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

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

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

Ответ 1

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

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

Кроме этого, возможно, нет изящного метода.  

Ответ 2

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

cars.stream().skip(1) // and then operations on remaining cars

Ответ 3

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

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

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

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

Ответ 4

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

Элегантно для меня.

Ответ 5

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

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

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

Ответ 6

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

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(...) .

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

for (Car car : cars)
{
  if (car == cars[0]) continue;
  ...   
}
  • Причина в том, что вы просили пропустить только первую итерацию цикла, и этот способ будет работать только в том случае, если автомобиль, расположенный в первом индексе в вашем контейнере, появится в нем только один раз,

  • Но что, если этот автомобиль появится не один раз в контейнере? в этом случае вы снова пропустите его, и вы пропустите больше итераций, кроме первого.

Ответ 12

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

    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++;
    }