为什么最后一个字符不出现?

时间:2018-12-26 18:13:39

标签: java string

我想对类似...----....--.-.-..3-4.4-2.1-1.1-1.1的字符串进行编码-显示,首先有三个点(.3),然后有四个连字符(-4),依此类推。

我差一点就做到了,但是任何地方都有一个错误...

static String pointsAndLines(String s){

    StringBuffer encodedString = new StringBuffer();

    int counter = 1;
    char currentChar = s.charAt(0);

    for(int i=1; i<s.length(); i++){
        if(s.charAt(i) != currentChar){
            encodedString.append(String.valueOf(currentChar) + counter);
            currentChar = s.charAt(i);
            counter = 1;
        } else counter++;
    }

    return encodedString.toString();

}

但是输出是这样的:

.3-4.4-2.1-1.1-1

缺少最后一个.1-为什么?

2 个答案:

答案 0 :(得分:1)

一旦您击中字符串的结尾,循环就会终止,并且最后一组不会追加到缓冲区中。您可以明确地附加它:

for(int i=1; i<s.length(); i++){
    if(s.charAt(i) != currentChar){
        encodedString.append(String.valueOf(currentChar) + counter);
        currentChar = s.charAt(i);
        counter = 1;
    } else counter++;
}
encodedString.append(String.valueOf(currentChar) + counter); // Here

答案 1 :(得分:0)

在您的代码中:

encodedString.append(String.valueOf(currentChar)+计数器);

最后一个.1不会附加到StringBuffer上,因为您要获取currentchar的值,该值包含在索引16上而不是在-上的先前值。在索引17上,当循环结束时,i的值等于String的长度减去1。

获取输出.3-4.4-2.1-1.1-1.1 您可以使用两个for循环,如下所示:

 public class StackOverFlowStringBuffer {

    public static void main(String[] args) {

        System.out.println(pointsAndLines("...----....--.-.-."));
    }

    static String pointsAndLines(String s) {

        StringBuffer encodedString = new StringBuffer();

        int counter = 1;
        char currentChar;

        for (int i = 0; i < s.length(); i++) {
            currentChar = s.charAt(i);
            if (i < s.length() - 1) {
                for (int j = i + 1; j < s.length(); j++) {
                    if (s.charAt(j) != currentChar) {
                        encodedString.append(String.valueOf(currentChar) + counter);
                        counter = 1;
                        i = j - 1;
                        break;
                    } else {
                        counter++;
                    }
                }
            } else {
                encodedString.append(String.valueOf(currentChar) + counter);
            }
        }

        return encodedString.toString();

    }
}