我不明白使用StringBuffer,追加,转换规则

问题描述:

我想知道是否有人可以帮我弄清楚为什么我的代码没有做到我期望的那样做。这个想法是在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

您在代码中有一个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 
    } 
} 

您while循环永远不会完成。如果s.charAt(i) == s.charAt(i+1)为真,标记会增加。但是因为i保持不变,while循环的条件保持不变,所以它永远运行。

在你的代码中有一些更多的错误(如i <= s.length()和尝试访问s.charAt(i + 1)将导致IndexOutOfBoundsException),但你会发现它们。