循环时递减递增

时间:2013-01-02 12:28:47

标签: java for-loop

我正在尝试在java循环中满足条件时递减增量器,例如: 假设我们有一个包含许多(升序排序)整数的ArrayList,当我遇到2个或更多后续的相等整数时,我想合并它们:

for(int i=0; i<intArr.size();i++){

 if(intArr.get(i).equals(intArr.get(i+1))){
    intArr.set(i,(intArr.get(i) + intArr.get(i+1)));
    intArr.remove(i+1);
    i--;
 }

} 

邮件底部的一个更具体的例子。

这将失败,增量器(i)将“暂时”设置为(i--),但是当它返回到for行时,它将具有其原始值。 你有任何想法如何递减我,以便在下一次迭代我仍然可以比较(i == i + 1?) 谢谢

public class Test
{
  private static final long serialVersionUID = 1L;

  public static void main(String[] args)
  {

    ArrayList<Integer> intArray = new ArrayList<Integer>();
    intArray.add(1);
    intArray.add(2);
    intArray.add(3);
    intArray.add(4);
    intArray.add(4);
    intArray.add(4);
    intArray.add(5);
    intArray.add(6);
    intArray.add(7);
    intArray.add(8);
    intArray.add(9);
    intArray.add(9);
    intArray.add(9);
    intArray.add(9);
    intArray.add(10);
    intArray.add(11);
    intArray.add(12);
    intArray.add(12);

    for (int i = 0; i < (intArray.size() - 1); i++)
    {
      if (intArray.get(i).equals(intArray.get(i + 1)))
      {
        intArray.set(i, (intArray.get(i) + intArray.get(i + 1)));
        intArray.remove(i + 1);
        i--;
      }
    }

    for (int i = 0; i < intArray.size(); i++)
    {
      System.out.println(intArray.get(i));
    }
  }

}

打印:

1
2
3
8
4
5
6
7
8
18
18
10
11
24

4 个答案:

答案 0 :(得分:2)

我建议使用Iterator.remove来折叠条纹,而不是处理指数:

final List<Integer> intArr = new ArrayList(Arrays.asList(1,1,2,2,2,4,5,7));
Integer previous = null;
for (Iterator<Integer> iter = intArr.iterator(); iter.hasNext();) {
  final int curr = iter.next();
  if (previous == null) previous = curr;
  else if (previous == curr) iter.remove();
  else previous = curr;
}
System.out.println(intArr);

答案 1 :(得分:2)

那是因为当它找到前两个4时它将它们改为8.现在,当第三个4来时,数组是

1 2 3 的 8 4 五 6 。 。

所以这一次,它检查是否(8 == 4),这是假的。所以它会跳过下一个4!

答案 2 :(得分:2)

哦,男孩......你的编码风格不干净......会以这种方式出现很多错误。

1)你不应该使用自动装箱。尤其是在与==

进行比较时

2)当你编写一个例子时,添加所有细节以便它可以实际运行(这还包括许多关于你正在使用的支持列表等的有用提示)[编辑:我看到你扩展了你的问题] < / p>

3)了解++ i和i ++之间的区别(实际上并不相关,但在其他情况下可能有所帮助

4)当[i]和[i + 1]相等时,为什么要跳回来?

5)支持列表(在您的情况下为intArr)可能无法跟踪从中删除项目时的顺序。

6)考虑用于存储唯一值的集合或映射。使用HashSet或TreeSet来包含元素的排序/排序

7)你仍然想以老式的方式使用它,使用while循环。

答案 3 :(得分:1)

如果条件变量没有递增,则可以使用while循环进行迭代。它还提高了可读性。

int i = 0;
while((i-1)<intArr.size())
{
  if(intArr.get(i).equals(intArr.get(i+1)))
  {
    intArr.set(i,(intArr.get(i) + intArr.get(i+1)));
    intArr.remove(i+1);
  }
  else
  {
    i++;
  }
}