簡體   English   中英

if 語句意外地在 for 循環內無限循環

[英]If statement unexpectedly loops infinitely inside for loop

輸入:“誰住在海底的菠蘿里?” 預期的 output:“誰在 elppaenip rednu 大海中撒謊?” (反尺寸5及以上字)

我認為 if 語句是問題,但我不知道為什么它不起作用。 我嘗試在 main 方法中使用 if 語句塊中的代碼,它工作正常。

public class Testing {

    public static void main(String[] args) {
        String sentence = "Who lives in a pineapple under the sea?"; 
        System.out.println(spinWords(sentence)); 
    }
    
      public static String spinWords(String sentence) {
        String[] words = sentence.split(" "); 
        int length = words.length; 
        String spinned = ""; 
        for (int i = 0; i < length; i++) {
            String word = words[i];  
            int wlength = word.length(); 
            if (wlength > 4) {  
                String reversed = ""; 
                for (i = wlength - 1; i >= 0; i--) {
                    reversed += "" + word.charAt(i); 
                }
                spinned += reversed + " ";
            } else {
              spinned += word + " "; 
            }
        }
        spinned = spinned.trim(); 
        return spinned; 
      }
}

這是我的第一個堆棧溢出問題,順便說一句,我真的不知道自己在做什么。 我也希望看到此代碼的更好實現(用於學習目的),謝謝。

用下面的代碼替換“if”塊。 您正在使用第一個“for”循環使用的變量“i”。 這導致了無限循環。

    if (wlength > 4) {  
        String reversed  = "";
         for(int j = 0; j < wlength; j++) {
             reversed = word.charAt(j) + reversed;
         }
         spinned += reversed + " ";
    } else {
      spinned += word + " "; 
    }

您的代碼中的問題是重復使用局部變量i正如其他人所指出的那樣。 通常,您永遠不希望嵌套循環計數器使用與外部循環計數器相同的變量名。

for (int i = wlength - 1; i >= 0; i--)是編譯錯誤(添加了int聲明)是有原因的。 而是簡單地使用另一個變量名:

for (int j = wlength - 1; j >= 0; j--)

這將修復代碼中的錯誤。 但是,由於您要求其他實現,我想我會使用StringBuilder顯示另一個選項,我相信它更容易閱讀:

public static void main(String[] args) {
    String sentence = "Who lives in a pineapple under the sea?";
    System.out.println(spinWords(sentence));
}

public static String spinWords(String sentence) {
    String[] words = sentence.split(" ");
    StringBuilder sb = new StringBuilder();

    for (String str : words) {
        if (str.length() >= 5) {
            sb.append(new StringBuilder(str).reverse());
        } else {
            sb.append(str);
        }
        sb.append(" ");
    }

    return sb.toString().trim();
}

在循環內連接String時,通常使用StringBuilder請參閱此答案

此外, StringBuilder具有reverse()方法,您可以使用它來反轉單個單詞,而不是使用嵌套循環。 然后,您只需使用toStringStringBuilder object 轉換為String

最后,我使用了for (String str: words)的增強 for 循環,它允許您直接在String值上循環,而不需要使用循環計數器。

這是一個單行:

public static String spinWords(String sentence) {
    return Arrays.stream(sentence.split(" "))
      .map(word -> word.length() < 5 ? word : new StringBuilder(word).reverse().toString())
      .collect(Collectors.joining(" "));
}

現場演示

暫無
暫無

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

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