Java 为什么for循环在无效子字符串检查之前退出?

Java 为什么for循环在无效子字符串检查之前退出?,java,string,for-loop,substring,Java,String,For Loop,Substring,我有一个我在高中为CS班写的程序。一开始,我没有发现任何问题,我很高兴我能把自己的体型缩小到合适的尺寸(不像我旁边的孩子)。最近我意识到代码应该有问题。让我给你背景资料 假定该类遍历一个字符串并删除所有重复的相邻字符,以便只保留其中一个字符。所以eeee变成了e,eeels变成了els 我的方法是遍历每个索引(最后一个除外),如果发现重复,则删除当前索引。为了处理3+个相邻字符,我每次都将for循环中的变量重置回-1,以便它从索引0开始,并查找另一对 我觉得它应该存在的问题是,如果字符串只是重复

我有一个我在高中为CS班写的程序。一开始,我没有发现任何问题,我很高兴我能把自己的体型缩小到合适的尺寸(不像我旁边的孩子)。最近我意识到代码应该有问题。让我给你背景资料

假定该类遍历一个字符串并删除所有重复的相邻字符,以便只保留其中一个字符。所以eeee变成了e,eeels变成了els

我的方法是遍历每个索引(最后一个除外),如果发现重复,则删除当前索引。为了处理3+个相邻字符,我每次都将for循环中的变量重置回-1,以便它从索引0开始,并查找另一对

我觉得它应该存在的问题是,如果字符串只是重复了同一个字符,当它缩小到只有一个字符时,它仍然应该尝试检查该字符和下一个字符,这将抛出一个错误

因为这很可能毫无意义,我在代码中加入了一些print语句来说明我的观点。请注意,字符串保存在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;
}
这是我的指纹

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
Checking->eee
新建副本->ee
-1<2==真
检查->ee
新副本->电子版
-1<1==true//这是真的,因此它应该再次循环。
这是一件奇怪的事情,回路断了。
eee
在我标记注释的地方,循环应该再执行一次(条件为true),这意味着代码将中断,因为它无法在索引2处获取子字符串,但代码就在那里退出并返回到主方法

虽然这显然有效,但我想解释一下。谢谢


编辑:如果问题确实出现,我知道我可以将条件(copy.length()>=2)放在If语句中,以确保字符串太小时不会发生任何事情,循环最终将中断。

循环不能再执行一次的原因是由于
循环使用的条件:

x < copy.length()-1
x
通常,在遍历项目列表时,您会使用:

x < copy.length()
x


x循环不再执行一次的原因是
for
循环使用的条件:

x < copy.length()-1
x
通常,在遍历项目列表时,您会使用:

x < copy.length()
x


x根据我的经验,删除集合中的当前索引\对象是个坏主意。也许,
节点
是一种很好的方法来处理需要它的情况,您最后一次打印时使用
copy.length
,但是循环使用
length-1
,当然,x将在最后(打印后)递增。所以这对我来说似乎是合乎逻辑的(快速阅读,可能是错误的)。基本上,您应该编写
System.out.println((x+1)+“<”+(copy.length()-1)+“=”+(x+1
以打印正确的下一页condition@ItamarGreen对不起,那没有任何意义。首先,我们处理的是字符串,而不是集合;然后,就不需要使用一些XML-DOM类来处理这个简单的字符串了。提示:这与
copy.substring(x,x+1)
@AxelH指出了正确的解决方案,以及循环看起来“中断”的原因。增量发生在循环结束时,然后在下一次迭代之前检查条件。根据我的经验,删除集合中的当前索引\对象是个坏主意。也许,
节点
是一种很好的方法来处理需要它的情况,您最后一次打印时使用
copy.length
,但是循环使用
length-1
,当然,x将在最后(打印后)递增。所以这对我来说似乎是合乎逻辑的(快速阅读,可能是错误的)。基本上,您应该编写
System.out.println((x+1)+“<”+(copy.length()-1)+“=”+(x+1
以打印正确的下一页condition@ItamarGreen对不起,那没有任何意义。首先,我们处理的是字符串,而不是集合;然后,就不需要使用一些XML-DOM类来处理这个简单的字符串了。提示:这与
copy.substring(x,x+1)
@AxelH指出了正确的解决方案,以及循环看起来“中断”的原因。增量发生在循环结束时,然后在下一次迭代之前检查条件。