2016-11-04 146 views
0

我有這個程序,我爲我的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語句中,以確保當字符串太小時沒有任何反應,並且循環將會最終打破。

+0

根據我的經驗,刪除集合中當前索引\對象是一個壞主意。也許'節點'是處理需要的情況的一個好方法[Node](https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html) – ItamarG3

+3

Your最後一個打印使用'copy.length',但循環使用'length -1',當然,x會在打印結束時遞增。所以這對我來說似乎是邏輯(快速閱讀,可能會誤)。基本上,你應該寫'System.out.println((x + 1)+「<」+(copy.length()-1)+「==」+(x + 1 AxelH

+0

@ItamarGreen對不起,但這沒有任何意義。首先,我們在這裏處理字符串,而不是集合;然後不需要爲這個簡單的字符串處理使用一些XML-DOM類。 – JimmyB

回答

2

的原因,你的循環將不會執行一個更多的時間是由於您的for循環使用的條件:

x < copy.length()-1 

通常情況下,通過項目的列表迭代時,你可以使用:

x < copy.length() 

x <= copy.length() - 1 

然而,你的循環使用都<(而不是<=)和copy.length() - 1(而不僅僅是copy.length())。因此,當x爲0且copye時,條件循環爲0 < 0,其計算結果爲false

重要的是要記住,x遞增後循環完成,這就是爲什麼你的支票在循環結束返回true是很重要的,但下面的循環條件返回false。