我有这个程序是我为高中的CS课程写的。起初,我发现它没有任何问题,并且很高兴我能够将其缩小到合适的尺寸(与我旁边的孩子不同)。最近我意识到代码应该存在问题。让我给你背景信息。
该类假设运行一个字符串并删除所有重复的相邻字符,以便只剩下其中一个字符。所以eeee变成了e,而eeel变成了el。
我的方法是运行每个索引(除了最后一个),如果找到重复,则删除当前索引。要解决3个以上相邻的字符,我每次将for循环中的变量重置为-1,以便它从索引0开始并寻找另一对。
我觉得它应该具有的问题是,如果字符串只是重复相同的字符,当它缩小到只有一个字符时,它仍应该尝试检查该字符和下一个字符,这会引发错误。
因为这很可能毫无意义,我在代码中加入了一些打印语句来说明我的观点。请注意,字符串保存在str实例变量中,但问题是要求它保持不变,所以我复制了一份。
这是我在方法中使用的代码:
public String removeDups(){
String copy = str;
for(int x = 0; x < copy.length()-1; x++){
System.out.println("Checking -> " + copy);
if(copy.substring(x, x+1).equals(copy.substring(x+1, x+2))){
copy = copy.substring(0, x) + copy.substring(x+1);
//Restarts the search to make sure three characters in a row are adressed correctly
x = -1;
}
System.out.println("New Copy -> " + copy);
System.out.println(x + " < " + copy.length() + " == " + (x < copy.length()-1));
}
return copy;
}
这是我检测到的问题的测试用例
ProblemX p5 = new ProblemX( "eee" );
s = p5.removeDups();
System.out.println( s );
s = p5.toString();
System.out.println( s );
这就是打印
Checking -> eee
New Copy -> ee
-1 < 2 == true
Checking -> ee
New Copy -> e
-1 < 1 == true //This is true, so it should loop again.
e //This is the weird thing, loop is broken.
eee
在我标记注释的地方,循环应该再执行一次(条件为真),这意味着代码会因为它不能在索引2处获取子字符串而中断,但代码在那里退出并完全回到主要方法。
虽然这显然有效,但我希望有一个探索。感谢。
编辑:如果问题出现了,我知道我可以将条件(copy.length()&gt; = 2)放在if语句中,以确保当字符串太小时没有任何反应,并且循环将最终破裂。
答案 0 :(得分:2)
你的循环不再执行一次的原因是由x < copy.length()-1
循环使用的条件:
x < copy.length()
通常,在遍历项目列表时,您将使用:
x <= copy.length() - 1
或
<
但是,您的循环使用<=
(而不是copy.length() - 1
)和copy.length()
(而不仅仅是x
)。因此,当copy
为0且e
为0 < 0
时,循环条件为false
,其结果为x
。
重要的是要记住,在循环结束后{{1}}递增,这就是为什么循环结束时的检查返回true,但是以下循环有条件返回false。