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

0 java loops

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

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

int count = 1;

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

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

    count = count++;
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 10

你有什么工作除了一个bug:count = count++什么都不做. count = count + 1会工作,或者count++,但是, count = count++是一个无操作.


And*_*own 5

如果您不需要特别跟踪计数,也可以使用布尔标志.

boolean first = true;
for (CustomObject co : CustomObjectCollection) {
    methodAll(co);
    if (!first) {
      methodSpecial(co);
    }
    first = false;
}
Run Code Online (Sandbox Code Playgroud)

使用哪种

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

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

性能

如果性能是一个问题,那么根据您的平台和实现来衡量它,但从一般经验,从最慢到最快,第一个和最后一个之间的差异<= 20x:

  1. 对于每个循环使用迭代器:最慢
  2. for(int i = 0; i < list.size() ; i++)
  3. int size = list.size()然后声明一个for(int i = 0; i < size; i++)循环

然而,这些速度结果取决于很多事情,除非性能是设计目标或已确定的问题与迭代器一起使用,直到您有理由使用其他两个中的一个 - 迭代器通常足够快.