【问题标题】:java foreach skip first iterationjava foreach 跳过第一次迭代
【发布时间】: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

标签: java foreach iteration skip


【解决方案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 循环是使用迭代器的所有实际用途的花哨语法。最好只使用迭代器并在开始循环之前前进。

              【讨论】:

                猜你喜欢
                • 2023-03-15
                • 2013-10-03
                • 2021-12-26
                • 1970-01-01
                • 1970-01-01
                • 2019-05-23
                • 2019-02-14
                • 2018-09-18
                • 1970-01-01
                相关资源
                最近更新 更多