我正在尝试在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
答案 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++;
}
}