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

时间:2016-11-04 14:03:42

标签: java string for-loop substring

我有这个程序是我为高中的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语句中,以确保当字符串太小时没有任何反应,并且循环将最终破裂。

1 个答案:

答案 0 :(得分:2)

你的循环不再执行一次的原因是由x < copy.length()-1 循环使用的条件:

x < copy.length()

通常,在遍历项目列表时,您将使用:

x <= copy.length() - 1

<

但是,您的循环使用<=(而不是copy.length() - 1)和copy.length()(而不仅仅是x)。因此,当copy为0且e0 < 0时,循环条件为false,其结果为x

重要的是要记住,在循环结束后{{1}}递增,这就是为什么循环结束时的检查返回true,但是以下循环有条件返回false。