【问题标题】:I fail to understand the rules of using StringBuffer, append, conversions我无法理解使用 StringBuffer、追加、转换的规则
【发布时间】:2017-12-05 06:23:48
【问题描述】:

我想知道是否有人可以帮助我弄清楚为什么我的代码没有按照我的预期执行。这个想法是计算StringBuffer 中相同的以下字母并将其转换为类似AABBC => 2A2B1C 的内容。现在我的程序没有这样做,这可能与我对这些新学概念的使用不当有关。我是否必须将marker 转换为char 才能打印出来?还是我的代码结构本质上是错误的?我也不确定StringBuffers 能做什么,不能做什么。

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
    }
}

【问题讨论】:

  • 使用调试器找出发生了什么
  • 不要更改循环内的i。会导致这样的问题

标签: java loops char type-conversion stringbuffer


【解决方案1】:

您的代码中有 off-by-one-error 错误。

您正在计算从 1 开始的字符的次数,但字符串索引从零开始,并且稍后在使用 getCharAt(i)marker 分配给 i 时将两者混合在一起减一(在这种情况下,它试图获取索引 4 处的字符,该字符被传递到字符串的末尾)。

解决此问题的一种简单方法是让您的计数 (marker) 也从 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
  }
}

【讨论】:

    【解决方案2】:

    你的 while 循环永远不会结束。

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

    您的代码中还有一些错误(例如 i &lt;= s.length() 并尝试访问 s.charAt(i+1) 会导致 IndexOutOfBoundsException),但您会发现它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-28
      • 2018-03-29
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2016-02-28
      相关资源
      最近更新 更多