2017-07-01 20 views
-1

我想知道是否有人可以幫我弄清楚爲什麼我的代碼沒有做到我期望的那樣做。這個想法是在StringBuffer中統計下列相同的字母,並將其轉換爲如下形式AABBC => 2A2B1C。現在我的程序沒有這樣做,這可能與我對這些新學到的概念的糟糕用法有關。我是否必須將轉換爲char才能打印出來?或者,我的代碼的結構本質上是錯誤的?我也不確定我能用StringBuffer做什麼,不能做什麼。我不明白使用StringBuffer,追加,轉換規則

package package1; 

public class Strings { 
    public static void main(String[]args){ 
     int marker = 1; 
     StringBuffer s2 = new StringBuffer(); 
     StringBuffer s = new StringBuffer("AAAA"); 
     for(int i = 0; i<=s.length(); i++){ 
      while(s.charAt(i) == s.charAt(i+1)){ 
       marker++; 
      } 
      i += marker; 
      s2.append(marker); 
      s2.append(s.charAt(i)); 
      marker = 0; 
     } 
     System.out.println(s2); // It simply prints out nothing 
    } 
} 
+0

使用調試器來了解發生了什麼 – Jens

+0

不要在循環中更改「i」。它會導致這樣的問題 – Jens

回答

0

您在代碼中有一個off-by-one-error錯誤。

你指望你有多少次看到從1但字符串索引開始一個字符從零開始,並且使用getCharAt(i)被關閉的一個(在這種情況下,後混合了兩個,當你分配到 i它試圖獲得索引4處的字符串,該字符串被傳遞給字符串的末尾)。

一種簡單的方法來解決它是讓你的計數()在0開始過,只加一要附加到字符串的內容:

package package1; 

public class Strings { 
    public static void main(String[]args){ 
    int marker = 0; // changing this to 0 
    StringBuffer s2 = new StringBuffer(); 
    StringBuffer s = new StringBuffer("AAAA"); 
    for(int i = 0; i<=s.length(); i++){ 
     while(s.charAt(i) == s.charAt(i+1)){ 
      marker++; 
     } 
     i += marker; 
     s2.append(marker + 1); // print out the count plus one because we are counting from zero 
     s2.append(s.charAt(i)); 
     marker = 0; 
    } 
    System.out.println(s2); // It simply prints out nothing 
    } 
} 
0

您while循環永遠不會完成。如果s.charAt(i) == s.charAt(i+1)爲真,標記會增加。但是因爲i保持不變,while循環的條件保持不變,所以它永遠運行。

在你的代碼中有一些更多的錯誤(如i <= s.length()和嘗試訪問s.charAt(i + 1)將導致IndexOutOfBoundsException),但你會發現它們。