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 跳过第一次迭代的主要内容,如果未能解决你的问题,请参考以下文章