Есть ли элегантный способ пропустить первую итерацию в цикле foreach Java5?
Пример псевдокода:
for ( Car car : cars ) {
//skip if first, do work for rest
.
.
}
Есть ли элегантный способ пропустить первую итерацию в цикле foreach Java5?
Пример псевдокода:
for ( Car car : cars ) {
//skip if first, do work for rest
.
.
}
Я бы не назвал его элегантным, но, возможно, лучше, чем использовать "первый" логический:
for ( Car car : cars.subList( 1, cars.size() ) )
{
.
.
}
Кроме этого, возможно, нет изящного метода.
С новым Java 8 Stream API он становится очень изящным. Просто используйте метод skip()
:
cars.stream().skip(1) // and then operations on remaining cars
Используйте Guava Iterables.skip()
.
Что-то вроде:
for ( Car car : Iterables.skip(cars, 1) ) {
// 1st element will be skipped
}
(Получил это от конца ответа msandiford и хотел сделать его автономным ответом)
for (Car car : cars)
{
if (car == cars[0]) continue;
...
}
Элегантно для меня.
Код SeanA имеет крошечную ошибку: второй аргумент для подсписок рассматривается как эксклюзивный индекс, поэтому мы можем просто написать
for (Car car : cars.subList(1, cars.size()) {
...
}
(Я, кажется, не могу комментировать ответы, следовательно, новый ответ. Должен ли я иметь определенную репутацию для этого?)
Я немного опоздал на это, но вы можете использовать вспомогательный метод, например:
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(...)
.
Я не человек java, но вы можете использовать:
for ( Car car : cars.tail() )
от java.util через Groovy JDK
Elegant? На самом деле, нет. Вам нужно будет проверить/установить логическое значение.
Для каждого цикла для всех практических целей используется синтаксис для использования итератора. Вам лучше просто использовать итератор и продвигаться, прежде чем вы начнете цикл.
Не так элегантно, но работает с итераторами
Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext()){
rows.next();
}
for (; rows.hasNext();) {
XXXXX row = (XXXXX) rows.next();
}
Это может быть не изящно, но можно инициализировать целочисленную переменную вне цикла for и увеличивать ее с каждой итерацией в цикле. Ваша программа будет выполняться только в том случае, если счетчик больше 0.
int counter = 0;
for ( Car car : cars ) {
//skip if first, do work for rest
if(counter>0){
//do something
}
counter++;
}
Я видел здесь несколько хороших решений, но, по моему мнению, вам следует избегать этого:
for (Car car : cars)
{
if (car == cars[0]) continue;
...
}
Причина в том, что вы просили пропустить только первую итерацию цикла, и этот способ будет работать только в том случае, если автомобиль, расположенный в первом индексе в вашем контейнере, появится в нем только один раз,
Но что, если этот автомобиль появится не один раз в контейнере? в этом случае вы снова пропустите его, и вы пропустите больше итераций, кроме первого.
Вы можете использовать счетчик. Несмотря на то, что кодирование не настолько развито, все же я считаю, что это самый простой способ пропустить первый элемент из списка.
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++;
}