为循环中的第一次迭代编程不同的行为

时间:2015-01-12 18:45:42

标签: java loops

我有一个需要迭代的对象集合。该集合的大小可变。如果集合中有多个对象,我需要对对象2 ..无穷大进行特殊处理。

这样做的首选方法是什么?例如:

int count = 1;

for (CustomObject co : CustomObjectCollection) {
    methodAll(co);

    if(count > 1) {
        methodSpecial(co);
    }

    count = count++;
}

1 个答案:

答案 0 :(得分:5)

如果您没有特别需要跟踪计数,也可以使用布尔标记。

boolean first = true;
for (CustomObject co : CustomObjectCollection) {
    methodAll(co);
    if (!first) {
      methodSpecial(co);
    }
    first = false;
}

使用哪种

使用哪个取决于您的具体用例。假设您不打算优化每个最后一次每秒操作的性能,那么选择声明您意图的选项

    如果你想跟踪或使用循环外的计数,可以
  1. count++(根据路易斯答案,它是count++,而不是count = count++
  2. 如果集合支持for(int i = 0; i < collection.size(); i++)操作,
  3. get(i)也很好。这也允许您通过将int i初始化为其他索引来跳过第一项。如果您不希望额外的计数变量挂在循环外,可能会使用它。
  4. 您想要以不同方式处理第一个和后续元素的上述boolean first = true;(或反boolean notFirst = false;)突出显示
  5. 如果您的收藏夹上有List界面,并希望跳过一定数量的元素,那么subList是一个不错的选择
  6. 性能

    如果需要考虑性能,那么根据您的平台和实施来衡量,但从一般经验来看,从最慢到最快,在第一个和最后一个之间的差异为<= 20x:

    1. 对于每个循环使用迭代器:slowest
    2. for(int i = 0; i < list.size() ; i++)
    3. 声明int size = list.size()然后声明for(int i = 0; i < size; i++)循环
    4. 然而,这些速度结果取决于很多事情,除非性能是设计目标或已确定的问题与迭代器一起使用,直到你有理由使用其他两个中的一个 - 迭代器通常足够快。