1

我试图在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 行时,它将具有其原始值。HD你知道如何减少 i 以便在下一次迭代中我仍然可以比较(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

4 回答 4

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);
于 2013-01-02T12:38:41.860 回答
2

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

1 2 3 8 4 5 6 。. .

所以这一次,它检查是否 (8 == 4),这是错误的。所以它跳过了接下来的 4 个!

于 2013-01-02T12:44:44.560 回答
2

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

1)你不应该使用自动装箱。尤其是在与 == 进行比较时

2)当您编写示例时,添加所有详细信息以便它可以实际运行(这还包括许多有用的提示,例如您正在使用哪些支持列表等)[编辑:我看到您扩展了您的问题]

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

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

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

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

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

于 2013-01-02T12:44:52.470 回答
1

如果您的条件变量在每次 for 迭代中都没有递增,则可以使用 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++;
  }
} 
于 2013-01-02T12:32:47.023 回答