我有這個程序,我爲我的CS課程在高中寫作。起初,我沒有發現任何問題,並且很高興能夠把它縮小到不錯的尺寸(不像我旁邊的小孩)。最近我意識到代碼應該存在問題。讓我給你提供背景信息。爲什麼在無效子串檢查之前退出循環?
該類設想運行一個字符串並刪除所有重複的相鄰字符,以便只保留其中一個。所以eeee變成了e,而eeels變成了els。
我的方法是運行通過每個索引(除了最後一個),如果它發現重複,刪除當前索引。要解決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
在我標記註釋的地方,循環應該再執行一次(條件成立),這意味着代碼wo因爲它不能在索引2處接收一個子字符串,但是代碼在那裏退出並且完全回到主方法。
雖然這顯然有效,我想要一個探索。謝謝。編輯:如果問題確實出現,我知道我可以把條件(copy.length()> = 2)放在if語句中,以確保當字符串太小時沒有任何反應,並且循環將會最終打破。
根據我的經驗,刪除集合中當前索引\對象是一個壞主意。也許'節點'是處理需要的情況的一個好方法[Node](https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html) –
ItamarG3
Your最後一個打印使用'copy.length',但循環使用'length -1',當然,x會在打印結束時遞增。所以這對我來說似乎是邏輯(快速閱讀,可能會誤)。基本上,你應該寫'System.out.println((x + 1)+「<」+(copy.length()-1)+「==」+(x + 1
AxelH
@ItamarGreen對不起,但這沒有任何意義。首先,我們在這裏處理字符串,而不是集合;然後不需要爲這個簡單的字符串處理使用一些XML-DOM類。 – JimmyB