【问题标题】:How does the concatenation of a String with characters work in Java?字符串与字符的连接如何在 Java 中工作?
【发布时间】:2014-01-23 04:38:30
【问题描述】:

以下是codingbat的问题。

给定一个字符串,返回一个字符串,其中原始字符中的每个字符都有两个字符。 例如:

doubleChar("The") → "TThhee"
doubleChar("AAbb") → "AAAAbbbb"
doubleChar("Hi-There") → "HHii--TThheerree"

我有两个语句可以做到这一点,但是注释中的语句没有给出异常输出:

public String doubleChar(String str) {
    String str1 = "";
    for(int i=0;i<str.length();i++)
    {
        //str1 += str.charAt(i) + str.charAt(i);
        str1 += str.substring(i,i+1)+str.substring(i,i+1);
    }
    return str1;
}

如果我将注释部分更改为str1 = str1 + str.charAt(i) + str.charAt(i),则输出符合要求。我无法理解这一点。如果连接没有,那么它不应该适用于任何一种情况。你能帮帮我吗?

【问题讨论】:

  • public String d(String s) { return s.length() == 0 ? "" : s.substring(0, 1) + s.substring(0, 1) + s(s.substring(1)); } 怎么样
  • @PeterLawrey + s(s.sub... -> + d(s.sub...

标签: java string


【解决方案1】:

str.charAt(i) 返回一个char,将两个chars 相加得到一个char,其代码点等于输入代码点的总和。当您以str + 开头时,第一个串联在Stringchar 之间,产生String,然后是第二个串联,也在Stringchar 之间。

您可以通过以下几种方式解决此问题,例如:

str1 += String.valueOf(str.charAt(i)) + str.charAt(i);

str1 += "" + str.charAt(i) + str.charAt(i);

或者,正如您已经发现的那样,并且可能是最易读的:

str1 = str1 + str.charAt(i) + str.charAt(i);

【讨论】:

    【解决方案2】:

    方法public char charAt(int index)返回一个char,所以行

    str1 += str.charAt(i) + str.charAt(i);
    

    对两个chars 执行+ 运算符。

    根据Java Specs

    15.18。加法运算符

    运算符 + 和 - 称为 加法运算符

    AdditiveExpression:
        MultiplicativeExpression
        AdditiveExpression + MultiplicativeExpression
        AdditiveExpression - MultiplicativeExpression
    

    加法运算符具有相同的优先级,并且在语法上是左结合的(它们从左到右分组)。

    如果+运算符的任一操作数的类型为String,则该操作为字符串连接。

    否则,+ 运算符的每个操作数的类型必须是可转换(第 5.1.8 节)为基本数字类型的类型,否则会发生编译时错误。

    在任何情况下,二元 - 运算符的每个操作数的类型都必须是可转换(第 5.1.8 节)为基本数字类型的类型,否则会发生编译时错误。

    所以一个 char + 一个 char 是加法,而不是串联。

    每个char 实际上都是一个整数值,被解释为一个字符。

    Section 15.15.3 of the Java Specs 说:

    15.15.3。一元加号运算符 +

    一元 + 运算符的操作数表达式的类型必须是可转换(第 5.1.8 节)为基本数值类型的类型,否则会发生编译时错误。

    对操作数执行一元数字提升(第 5.6.1 节)。一元加表达式的类型是操作数的提升类型。一元加号表达式的结果不是一个变量,而是一个值,即使操作数表达式的结果是一个变量。

    在运行时,一元加表达式的值是操作数的提升值。

    因此,添加两个chars 会产生一个int。当你+= 那个int 时,它被转换成一个String 连接到所述字符串。

    要解决此问题,您可以使用此问题的任何答案:How to convert a char to a String?,例如

    str1 += String.valueOf(str.charAt(i)) + str.charAt(i);
    

    str1 += "" + str.charAt(i) + str.charAt(i);
    

    【讨论】:

    • 它可能太密集,OP 无法理解。
    【解决方案3】:
    public String doubleChar(String str) {
     String newStr="";    // created variable to store our result.
     for(int i=0;i<str.length();i++){ // loop through each char in the string.
       char add = str.charAt(i); // take out single char from the string and store it into am variable.
       newStr+=""+add+add;     // add each character
     }
     return newStr;
    }
    

    【讨论】:

      【解决方案4】:

      问题是您试图添加两个字符,这与添加两个字符串的行为不同。您需要做的就是将 char 保存为字符串,然后您可以按照自己的方式添加它们。

      public String doubleChar(String str) {
          String str1 = "";
          for(int i=0;i<str.length();i++)
          {
              String currentChar = Character.toString(str.charAt(i);
              str1 += currentChar + currentChar;
          }
          return str1;
      }
      

      【讨论】:

        【解决方案5】:
        public String doubleChar(String str) {
          String result = "";
          for ( int i=0;i<str.length();i++){
            String ww = str.substring(i, i+1);
            result += ww + ww;
          }
          return result;
        }
        

        【讨论】:

        • 虽然此答案可能是正确且有用的,但如果您 include some explanation along with it 解释它如何帮助解决问题,则最好。这在未来变得特别有用,如果有一个变化(可能不相关)导致它停止工作并且读者需要了解它曾经是如何工作的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        • 2020-08-18
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        相关资源
        最近更新 更多