我想对类似...----....--.-.-.
到.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
-为什么?
答案 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();
}
}