[英]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()
方法,您可以使用它來反轉單個單詞,而不是使用嵌套循環。 然后,您只需使用toString
將StringBuilder
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.