Почему моя строка превращается в целые числа вместо букв после того, как я добавляю символы с +?
Итак, вот задача: для заданной строки вернуть строку, где для каждого символа в оригинале есть два символа.
И я не понимаю, почему выводятся цифры вместо букв, я пытался не работает?
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") → "TThhee"
doubleChar ("AAbb") → "AAAAbbbb"
Выход:
doubleChar ("The") → "168208202"
doubleChar ("AAbb") → "130130196196"
Ответы
Ответ 1
В Java тип примитива char
в основном представляет собой просто числовое значение, которое отображается на символ, поэтому, если вы добавите вместе два значения char
они получат число, а не другой char
(и не String
), так что в итоге вы получите int
как вы: видишь.
Чтобы это исправить, вы можете использовать метод Character.toString(char)
следующим образом:
s += Character.toString(str.charAt(i)) + Character.toString(str.charAt(i))
Но все это довольно неэффективно, потому что вы делаете это в цикле, и поэтому конкатенация строк без необходимости создает много объектов String
. Более эффективным является использование StringBuilder
и его метода 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();
Ответ 2
Почему он выводит целые числа?
Оператор + перегружен в Java для выполнения конкатенации строк только для String
, а не для char
.
Из спецификации Java:
Если тип любого из операндов оператора + - String, то операция - конкатенация строк.
В противном случае тип каждого из операндов оператора + должен быть типом, который может быть преобразован (§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"
Ответ 3
Сначала вы добавляете числовые значения символов, прежде чем объединять результат (теперь целочисленный) в строку. Попробуйте отладить операторы печати:
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();
}
Ответ 4
Вы добавляете значение двух символов вместе. Изменение типа String
конкатенации из:
s += str.charAt(i) + str.charAt(i);
Для того, чтобы:
s += str.charAt(i) + "" + str.charAt(i);
Что обеспечит преобразование символов в String
.
Примечание. Это быстрое решение, и вы должны использовать StringBuilder
при конкатенации String
внутри цикла. Посмотрите другие ответы о том, как это сделать.
Ответ 5
String.charAt()
возвращает char
(https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int)), поэтому вы работаете с одним символом. С одним char
вы можете выполнять над ним операции следующим образом (который выведет "65", что является значением ASCII для символа "A"):
System.out.println('A' + 0);
Вы можете напечатать значение ASCII для следующего символа ("B"), добавив 1 к 'A'
, например так:
System.out.println('A' + 1);
Чтобы ваш код работал - чтобы он удваивал каждый символ - есть несколько вариантов. Вы можете добавить каждый символ по одному:
s += str.charAt(i);
s += str.charAt(i);
или различные способы приведения операции к строке:
s += "" + str.charAt(i) + str.charAt(i);