36

所以这是任务:给定一个字符串,返回一个字符串,其中对于原始字符串中的每个字符,都有两个字符。

而且我不明白为什么它的输出是数字而不是字母,我试过了不起作用?

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

预期的 :

doubleChar("The") → "THhee"

doubleChar("AAbb") → "AAAAbbbb"

输出:

doubleChar("The") → "168208202"

双字符(“AAbb”)→“130130196196”

4

5 回答 5

54

在 Java 中,char原始类型基本上只是一个映射到字符的数值,因此如果将两个char值相加,它们会产生一个数字而不是另一个char(而不是 a String),因此您最终会得到a int

要解决此问题,您可以使用如下Character.toString(char)方法

s += Character.toString(str.charAt(i)) + Character.toString(str.charAt(i))

但这一切都相当低效,因为您是在循环中执行此操作,因此字符串连接会产生大量String不必要的对象。更有效的是使用 aStringBuilder及其append(char)方法,如下所示:

StringBuilder sb = new StringBuilder(str.length() * 2);
for (int i = 0; i < str.length(); ++i) {
    char c = str.charAt(i);
    sb.append(c).append(c);
}
return sb.toString();
于 2019-07-10T20:04:07.410 回答
23

为什么它输出整数?

+ 运算符在 Java 中被重载以仅对Strings 而非chars 执行字符串连接。

来自Java 规范

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

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

在您的情况下, char 被转换为其原始值(int),然后添加。

相反,使用StringBuilder.append(char)将它们连接成一个String.

如果性能不是问题,您甚至可以这样做:

char c = 'A';
String s = "" + c + c;

s += "" + c + c;

这将强制使用 +String连接运算符,因为它以String("") 开头。上面的 Java 规范通过示例进行了解释:

+ 运算符在语法上是左结合的,无论它是由类型分析确定是表示字符串连接还是数字加法。在某些情况下,需要小心才能获得所需的结果。例如 [...]

1 + 2 + " fiddlers""3 fiddlers"

但结果:

"fiddlers " + 1 + 2"fiddlers 12"

于 2019-07-10T20:07:06.683 回答
12

在将结果(现在是整数)连接到字符串之前,您首先添加 chars 的数值。尝试使用打印语句进行调试:

public static String doubleChar(String str) {
  String s = "";
  for (int i = 0; i < str.length(); i++) {
    System.out.println(str.charAt(i));
    System.out.println(str.charAt(i) + str.charAt(i));
    s += str.charAt(i) + str.charAt(i);
  }
  return s;
}

做你想做的更有效的方法是:

public static String doubleChar(String str) {
  StringBuilder sb = new StringBuilder(str.length() * 2);
  for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
    sb.append(c).append(c);
  }
  return sb.toString();
}
于 2019-07-10T20:01:27.597 回答
2

您将两个字符的相加。更改String串联:

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

至:

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

这将确保字符转换为String.

注意:这是一个快速修复,您应该在循环内连接StringBuilder时使用。String有关如何完成此操作,请参阅其他答案。

于 2019-07-10T19:55:45.713 回答
2

String.charAt()返回一个charhttps://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int)),因此您正在处理单个字符。使用 one char,您可以像这样对其执行操作(将打印“65”,这是 'A' 字符的 ASCII 值):

System.out.println('A' + 0);

您可以通过将 1 添加到 来打印下一个字符(“B”)的 ASCII 值'A',如下所示:

System.out.println('A' + 1);

为了使您的代码工作 - 使每个字符加倍 - 有许多选项。您可以一次附加每个字符:

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

或将操作转换为字符串的各种方法:

s += "" + str.charAt(i) + str.charAt(i);
于 2019-07-10T20:06:49.593 回答