当我创建一个压缩字符串的程序时遇到了这个奇怪的问题,我会将代码片段与其输出粘贴,我希望有人能够清楚地解释为什么会发生这种情况。
第一个代码片段:此处如果连续出现相同的字母,则字母的连续出现将被相同字母的总数替换。例如: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的地址。但下一段代码再次让我感到困惑。
String prev= "abc";
String curr = "def";
String result="";
result+=prev+curr;
System.out.println(result);
我认为这是因为右手操作正在执行ASCII添加,我无法得出结论,任何人都可以澄清。
我睡眠不足,因此我无法得出结论,因此要求某人澄清我的琐碎怀疑。
答案 0 :(得分:2)
它与参考无关。当您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; // Shorthand used here
在这种情况下,或在compressed+=""+prev+count
情况下,由于操作从左到右发生,+运算符应用于字符串(""
)和char(prev
)和表现得像追加并且还返回一个字符串。然后使用另一个int(prev
)
更好的方法是使用StringBuilder
答案 1 :(得分:1)
查看this subject和JLS 15.18.1部分:
由于运算符的组合,您会看到此行为 优先级和字符串转换。
如果只有一个操作数表达式是String类型,则对另一个操作数执行字符串转换(第5.1.11节)以生成 运行时的字符串。
因此,你的第一个表达中的右手操作数是 隐式转换为字符串:
string = string + ((char)65) + 5;
对于第二个表达式
string += ((char)65) + 5;
+=
复合赋值运算符必须与+
一起考虑。 由于+=
弱于+
,因此首先评估+
运算符。 我们有一个char
和一个 int ,结果是binary numeric promotion到int
。只有这时才评估+=
,但此时 涉及+
运算符的表达式的结果已经过评估。
答案 2 :(得分:0)
每当你在java中向int添加一个char时,它首先将该字符转换为其等效的ASCII值,然后将其添加到整数
例如,假设以下情况,
char c ='a'; //'a'的ASCII值为97
int i = c + 5; //结果将是97 + 5 = 102
我认为这回答了你的上半部分问题
现在是第二部分,
无论何时在Java中使用速记运算符,都会首先计算右侧的表达式。
因此,对于表达
结果+ = prev + curr评估为
结果=结果+(prev + curr);
因此,
result+=prev+curr; // Here first it appends "abc" with "def" and then the resultant "abcdef" is appended to as result .
答案 3 :(得分:0)
您可以将字符值“prev”转换为字符串,然后将计数附加到它。
压缩+ = Character.toString(prev)+ count;