2011-04-18 162 views
38

有没有一种优雅的方式来跳过Java5 foreach循环中的第一次迭代?java foreach跳过第一次迭代

示例伪代码:

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

仅供参考,你的程序将只执行,Java5中一直没有“新”为5 - 6年。 – cHao 2011-04-18 23:46:37

+0

我怀疑这是foreach循环明确无意处理的内容。 – Doug 2011-04-18 23:47:44

+0

猜我应该说*更新*:P – 2011-04-18 23:51:27

回答

48

我不会把它优雅,但也许比用“第一”布尔更好:

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

除此之外,大概没有巧妙的方法。  

+0

显然这只适用于如果你有一个列表:) – 2011-04-18 23:47:39

+0

不是所有的有序集合类型和数组都有这样的“子集”类型的命令? – RHSeeger 2011-04-19 00:18:04

+0

@RHSeeger不,我不这么认为。我的意思是,唯一让列表成为列表的事实是它是有序的,所以如何指定无序集合的子集的边界?我想你可以跳过迭代器的第一次迭代,但不能保证你总是跳过第一个元素。 – 2011-04-19 01:48:32

1

优雅?不是真的。你需要检查/设置一个布尔值。

for-each循环用于所有实际目的使用迭代器的花式语法。在开始循环之前,最好使用迭代器并前进。

3

我不是一个java的人,但你可以使用:

for (Car car : cars.tail()) java.util中通过Groovy JDK

+0

它是否认为汽车是一个列表? – 2011-04-19 00:23:50

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

足够优雅的我。

+0

似乎更清楚这种方式对我来说......大概在一个大名单上快得多? – noelicus 2013-04-27 11:08:37

+1

除非重复一个元素,否则为优雅+1。 – borjab 2014-03-04 12:34:49

+0

我投这个最好的答案! :-) – 2015-02-18 21:37:28

15

SeanA的代码有一个微小的错误:在第二个参数子列表被视为一个独特的指数,所以我们可以只写

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

(我似乎并没有能够对答案进行评论,因此。新的答案我需要一定的知名度要做到这一点) 

+2

您可能需要更多的代表性。 – 2011-04-19 03:27:41

+2

你现在应该可以[评论](http://stackoverflow.com/privileges/comment)了。 – Ishtar 2011-04-19 12:08:48

+1

谢谢!回答更新 – 2011-04-19 14:30:02

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”是作为练习留给读者:)


编辑:仔细观察,我发现番石榴有一个Iterables.skip(...)here

22

使用番石榴Iterables.skip()

喜欢的东西:

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

(从msandiford's answer末得到了这一点,并想使之成为独立的答案)

+1

我喜欢这种方式 - 很干净。谢谢 – 2013-08-21 20:40:10

1

不那么优雅,但与迭代器

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

一起工作新的Java 8 Stream API它实际上变得非常优雅。只需使用skip()方法:

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

这可能不是优雅,但一个能外的初始化一个整型变量for循环,并与内环路每次迭代增加它。 计数器是否大于0

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