簡體   English   中英

While循環不會退出

[英]While loop does not exit

在嘗試編寫簡單的Java代碼以使用循環替換給定字符串中的特定字符時,我很困惑地發現了錯誤。 詳細信息如下:

INPUT String : "123qq11 1q1 11q1 1qq11 1q1 11q1"


REQUIRED OUTPUT: "123QQ11 1Q1 11Q1 1QQ11 1Q1 11Q1"


GOT OUTPUT:   "Q23QQ11 1Q1 11Q1 1QQ11 1Q1 11Q1" as infinite loop

算法:在給定的字符串中用“ Q”替換“ q”。

我要更正的代碼是:

public class Rani {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("123qq11 1q1 11q1 1qq11 1q1 11q1");
        int j = 0;
        int i = 0;
        while (i < sb.length()) {
            while (i + 1 < sb.length()) { // while 2nd
                i++;

                if (sb.charAt(i) == 'q') {
                    j = i;
                    break;
                } else {
                    break;
                }
            }

            sb.replace(j, j + 1, "Q");

            System.out.println(sb);
        }
    }
}

作為Java和編程的新手,我無法管理這些更正。

首先,您不需要2 while循環。

其次, i永遠停留在sb.length() - 1上,從而使其成為無限循環。

您可以使用replacereplaceAll代替。

String st = "123qq11 1q1 11q1 1qq11 1q1 11q1"
st = st.replace("q", "Q");

如果您想用while循環來做。

int i = 0; 
while(i < sb.length())
{
 if(sb.charAt(i) == 'q')
  sb.setCharAt(i, 'Q');
i++;
}

這是工作代碼

 public static void main(String[] args) {
    StringBuilder sb = new StringBuilder("123qq11 1q1 11q1 1qq11 1q1 11q1");
    int j = 0;
    int i = 0;
    while (i < sb.length()) {
        while (i < sb.length()) { // while 2nd

            if (sb.charAt(i) == 'q') {
                j = i;
                break;
            }
            i++;
        }

        sb.replace(j, j + 1, "Q");
        System.out.println(sb);
    }
}

輸出:123QQ11 1Q1 11Q1 1QQ11 1Q1 11Q1

如果您不想使用replace,則可以執行此操作。

for (int i = 0; i < st.length(); i++)
    if (st.charAt(i) == 'q')
        st.setCharAt(i, 'Q');
public static void main (String[] args) {
         StringBuilder sb = new StringBuilder("123qq11 1q1 11q1 1qq11 1q1 11q1");
         String strnew = "";
         for(int i=0;i<sb.length();i++)
         {
             if(sb.charAt(i)=='q')
             {      
                 strnew=strnew+"Q";

             }
             else
                 strnew=strnew+sb.charAt(i);
         }

         System.out.println(strnew);
    }

在您的代碼中,您告訴我過快增加。 在內部循環中, i只能達到30,而長度實際上是31。如果將i++移到第一個循環的末尾,但在我們內部循環的那一側,它應該按您想要的方式工作。 像這樣:

...
if (sb.charAt(i) == 'q') {
                j = i;
                break;
            }
            i++;
        }
...

唯一的問題是您總是替換字符串的第一個字符。 第一個數字“ 1”被替換為“ Q”。 因為您使用j代替“ q”,所以它始終是第0個字符。

您甚至可以只使用一個循環就可以使購買更簡單:

while (i<sb.length()){
    if (sb.charAt(i) == 'q'){
        sb.replace(i, i + 1, "Q");
    }
    i++;
}
System.out.println(sb);

或者您可以使用for循環:

for (i =0; i<sb.length();i++){
    if (sb.charAt(i)=='q'){
        sb.replace(i, i+1, "Q");
    }       
}
System.out.println(sb);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM