当我创建一个压缩字符串的程序时遇到了这个奇怪的问题,我将把代码片段和它们的输出粘贴在一起,我希望有人能清楚地解释为什么会这样。
第一个代码片段:这里如果连续出现相同的字母,则将连续出现的字母替换为相同字母的总数。例如:aaabbb 应该写成 a3b3。
public static String compress(String str){
String compressed = "";
char prev = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
char curr = str.charAt(i);
if (curr == prev) { // in case curr is equal to prev
count++;
} else { // in case curr is not equal to prev
//compressed=compressed+prev+count;
compressed+=prev+count; // Shorthand used here
count=1;
prev=curr;
}
}
compressed=compressed+prev+count; // Shorthand not used
System.out.println(compressed);
return compressed;
}
上面这段代码用aabbccaabbccaabbccaabb输入时的输出是99100101991001019910010199b2,观察输出的最后两个元素,这是因为在循环外,没有使用速记。如果我在循环内将表达式写为 compressed = compressed +prev+count,我将获得预期的输出。
我认为这个输出是因为操作弄乱了字符串的地址。但是接下来的代码又把我搞糊涂了。
String prev= "abc";
String curr = "def";
String result="";
result+=prev+curr;
System.out.println(result);
我认为这是因为右手操作在进行ASCII加法,我无法得出结论,谁能解释一下。
我 sleep 不足,因此无法得出结论,因此请人澄清我的小疑惑。
最佳答案
与引用无关。当您执行 prev+count
时,prev
中字符的 ascii 值将与整数计数相加。在这种情况下:
“a”的 ascii 是 97,它出现了两次......所以 97 +2 = 99 ..
“b”的 ascii 是 98,它出现了两次...所以 98 +2 = 100 ..
"c"的 ascii 是 99,它出现了两次...所以 99 +2 = 101 ..
这就是为什么输出是 99100101991001019910010199100
试试这个:compressed+=(""+prev)+count;//这里使用简写
在这种情况下,或者在 compressed+=""+prev+count
情况下,由于操作是从左到右发生的,+ 运算符应用于字符串 (""
) 和 char(prev
) 并且行为类似于 append 并且还返回一个字符串。然后将生成的字符串附加到另一个 int (prev
)
更好的方法是使用 StringBuilder
关于Java String += 需要速记解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24906705/