【问题标题】:While loop with boolean not terminating带有布尔值的while循环未终止
【发布时间】:2017-06-04 14:04:23
【问题描述】:

我正在编写一个程序来使用以下程序删除字符串中的连续重复字符:

static void main(String[] args){

String s = "abcdeedcbfgf";
removeConsecutiveDuplicate(s);

}

    static void removeConsecutiveDuplicate(String s) {
        String tmp = "";
        boolean isEligible = false;
        for (int i = 0; i < s.length() - 1; i++) {
            if (s.charAt(i) == s.charAt(i + 1)) {
                tmp = s.substring(0, i) + s.substring((i + 2), s.length());
                System.out.println(tmp);
                s = tmp;
                isEligible = true;
                break;
            } 
        }

        System.out.println("s is:" + s);
        while ( isEligible)
            removeConsecutiveDuplicate(s);
    }

输出应该是:afgf 当没有连续的字符并且它应该停止,因为我在 while 中使用标志。但标志正在获得真正的价值。

不知道效果如何?

有人可以帮助我了解我做错了什么吗?

【问题讨论】:

  • 这是因为isEligible 从不改变它首次声明的框架中的值。这将运行多长时间?因为在我看来,你最终会很快用完堆
  • 即每次调用removeConsecutiveDuplicate() 时,您都会为isEligible 生成一个新范围和一个新值。这个新值将传回,也不会在您的初始 while 循环中可见
  • main() 中的字符串 s 在调用后将保持不变(当你让它按照需要执行并在之后返回时)。我认为您希望该方法将更改后的 s 返回给调用者。
  • @CraigR8806 - 但是while 循环是函数中吗?
  • @CraigR8806:即使我从 for 循环中删除标志并将其作为方法参数,它也会进入无限循环..

标签: java string while-loop infinite-loop


【解决方案1】:

While 循环是 while(true) 。你永远不会让它成为假的。 一旦 iseligible 为真,您将陷入无限循环。 将 while 更改为 if 。 while(iseligible) => if(iseligible) 。

【讨论】:

  • 不,我不这么认为。提问者的条件是i &lt; s.length() - 1,所以i + 1 最多等于s.length() - 1。这里没有问题。
  • 哎呀!!我的错 。现在改变了答案。谢谢@Ole V.V.
  • 当我更改为 IF 时,它起作用了。但我无法理解如何?无论是while还是If,当我进行递归调用时,isEligible都会变为false。你能帮帮我吗?
  • 这是因为递归方法的每次调用都有自己的isEligible 变量。调用者看不到被调用方法的变化。再次阅读你关于递归的章节。
  • @OleV.V.:我知道 while 循环存在一些问题。但是我设置了标志的条件,所以当它为假时,为什么它会再次进入?而循环定义说“它在最后调用自己”完成后没有堆栈可以爬回。它的最后一次迭代设置了它结束时的状态。
【解决方案2】:

解决方法是从您的方法中返回新字符串:

static String removeConsecutiveDuplicate(String s) {
    // existing code, except...
    return tmp;
}

然后在调用方法中,检查是否改变了

String s = "abcdeedcbfgf";

while (true) {
    String next = removeConsecutiveDuplicate(s);
    if (next.equals(s))
        break;
    s = next;
}

完全删除isEligible的变量和概念。


另外,substring()的第二个参数也不需要指定,因为如果省略则暗示“到字符串结尾”,即:

s.substring(i, s.length())

等同于

s.substring(i);

【讨论】:

  • s.substring(i, s.length) 将删除不一样的字符。在下面的代码中尝试过:
      String removeConsecutiveDuplicate(String s){ String tmp = ""; for (int i = 0; i 
    它不起作用..
  • 哦,你还需要s.substring(0, i)。你可以做s.substring(0, i) + s.substring(i + 2),省略第二个参数给substring()second调用。
  • @Bohemian:感谢您的解决方案。它真的很有帮助。你能解释一下为什么我不能像以前那样使用“while循环”吗?而且您使用的方式正在工作..事实上,您使用的 while 循环必须最终成为一个无限循环。
  • @YogeshMalhotra 当“字符串没有改变”时退出while循环,这是您原始代码的意图。
猜你喜欢
  • 2015-05-24
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2017-11-20
  • 2020-12-03
  • 1970-01-01
  • 2020-10-05
  • 2016-09-19
相关资源
最近更新 更多