【问题标题】:Java String += Shorthand explanation neededJava String += 需要简写解释
【发布时间】:2014-09-14 09:56:43
【问题描述】:

在创建压缩字符串的程序时遇到了这个奇怪的问题,我会将代码 sn-ps 与他们的输出粘贴在一起,我希望有人能清楚地解释为什么会发生这种情况。

第一个代码sn-p:这里如果相同的字母连续出现,那么连续出现的字母被替换为相同字母的总数。例如: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 加法,我无法得出结论,谁能澄清一下。

我睡眠不足,因此无法得出结论,因此请某人澄清我的琐碎疑问。

【问题讨论】:

  • 预期输出是什么?
  • 我猜是 a2b2c2a2b2c2a2b2c2a2b2 @Vij 纠正我,如果我错了
  • 给定输入的预期输出是 a2b2c2a2b2c2a2b2c2a2b2

标签: java string reference shorthand


【解决方案1】:

它与参考无关。当您执行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),其行为类似于 append 并返回一个字符串。然后将生成的字符串附加另一个 int (prev)

更好的方法是使用StringBuilder

【讨论】:

  • 是的,只需 ""+prev+count 就可以解决问题,但我怀疑为什么 += 实际上会这样?你有解释吗?
  • Raj,是的,就是这样。感谢您的回答。正如我所说,睡眠不足对我的事业没有帮助。是的,我也使用 stringbuilder 和 append 方法编写了相同的程序,只是在尝试使用 String。
【解决方案2】:

看看this subjectJLS 15.18.1 部分:

您将这种行为视为运算符组合的结果 优先级和字符串转换。

JLS 15.18.1 状态:

如果只有一个操作数表达式是字符串类型,则对另一个操作数执行字符串转换(第 5.1.11 节)以生成一个 运行时的字符串。

因此,第一个表达式中的右手操作数是 隐式转换为字符串:string = string + ((char)65) + 5;

对于第二个表达式,但是 string += ((char)65) + 5; += 复合赋值运算符必须与+ 一起考虑。 由于+=+ 弱,所以首先评估+ 运算符。 我们有一个char 和一个int,这导致binary numeric promotionint。只有 += 被评估,但此时 涉及+ 运算符的表达式的结果已经被求值。

【讨论】:

    【解决方案3】:

    当你在 java 中添加一个 char 到一个 int 时,它首先将字符转换为它的等效 ASCII 值,然后将它添加到整数中

    例如假设以下场景,

    字符 c = 'a'; // 'a' 的 ASCII 值是 97

    int i = c + 5 ; // 结果将是 97 + 5 = 102

    我认为这回答了你前半部分的问题

    现在是第二部分,

    每当您在 Java 中使用速记运算符时,首先计算右侧的表达式。

    因此,用于表达

    result += prev + curr 它被评估为

    result = result + (prev + curr);

    因此,

    result+=prev+curr; // Here first it appends "abc" with "def" and then the resultant "abcdef" is appended to as result .
    

    【讨论】:

    • 你同意shubhang,第二个表达式没有冲突,因为两个操作数都是相同的数据类型并且它们是字符串。在第一个表达式中,因为有字符和整数,所以发生 ASCII 转换
    【解决方案4】:

    您可以将字符值“prev”转换为字符串,然后将计数附加到它。

    压缩 += Character.toString(prev) + count;

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多