java foreach 跳过第一次迭代

Posted

技术标签:

【中文标题】java foreach 跳过第一次迭代【英文标题】:java foreach skip first iteration 【发布时间】:2011-08-08 06:41:49 【问题描述】:

有没有一种优雅的方法可以跳过 Java5 foreach 循环中的第一次迭代?

示例伪代码:

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

【问题讨论】:

作为参考,Java5 已经有 5-6 年没有“新”了。 我怀疑这是 foreach 循环明确不打算处理的事情。 猜我应该说 newer :P 【参考方案1】:

您可以使用计数器。虽然没有那么成熟的编码,但我仍然发现它是从列表中跳过第一个元素的最简单方法。

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

【讨论】:

【参考方案2】:

我来晚了一点,但您可以使用辅助方法,例如:

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


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

【讨论】:

【参考方案3】:

这可能不太优雅,但可以在 for 循环外初始化一个整数变量,并在循环内的每次迭代中递增它。 只有当计数器大于 0 时,您的程序才会执行。

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

不太优雅,但可以使用迭代器

Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext())
    rows.next();

for (; rows.hasNext();) 
    XXXXX row = (XXXXX) rows.next();

【讨论】:

【参考方案6】:

我不会称之为优雅,但也许比使用“第一个”布尔值更好:

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

   .
   .

除此之外,可能没有优雅的方法。

【讨论】:

不是所有有序集合类型和数组都有这样的“子集”类型命令吗? @RHSeeger 不,我不这么认为。我的意思是,使 List 成为 List 的唯一因素是它是有序的,那么如何指定无序集合的子集的边界呢?我想你可以跳过迭代器的第一次迭代,但不能保证你总是跳过相同的第一个元素。 还有一个括号:)【参考方案7】:

SeanA 的代码有一个小错误:sublist 的第二个参数被视为排他索引,所以我们可以写

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

(我似乎无法对答案发表评论,因此有了新答案。我需要一定的声誉才能做到这一点吗?)

【讨论】:

你现在应该可以comment了。【参考方案8】:

使用番石榴Iterables.skip()

类似:

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

(从msandiford's answer 的末尾得到这个,并希望使其成为一个独立的答案)

【讨论】:

【参考方案9】:
for (Car car : cars)

   if (car == cars[0]) continue;
   ...

对我来说足够优雅。

【讨论】:

这样对我来说似乎更清晰......而且在大名单上可能更快? 除非重复一个元素,但要为优雅 +1。 Ew。为循环的每次迭代添加不必要的条件?不用了。【参考方案10】:

我不是 java 人,但你能用吗:

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

【讨论】:

它是否假定汽车是一个列表?【参考方案11】:

优雅?并不真地。您需要检查/设置一个布尔值。

for-each 循环是使用迭代器的所有实际用途的花哨语法。最好只使用迭代器并在开始循环之前前进。

【讨论】:

以上是关于java foreach 跳过第一次迭代的主要内容,如果未能解决你的问题,请参考以下文章

迭代器迭代的时候跳过第一部分

perl foreach 循环跳过特定文件夹下特定文件的迭代

foreach 循环,判断哪个是循环的最后一次迭代

Qt foreach() 仅迭代一次,忽略其余项目

c:forEach varStatus 属性

使用setTimeout跳转到(Typescript).forEach循环中的下一次迭代