Почему моя строка превращается в целые числа вместо букв после того, как я добавляю символы с +? - программирование
Подтвердить что ты не робот

Почему моя строка превращается в целые числа вместо букв после того, как я добавляю символы с +?

Итак, вот задача: для заданной строки вернуть строку, где для каждого символа в оригинале есть два символа.

И я не понимаю, почему выводятся цифры вместо букв, я пытался не работает?

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"

4b9b3361

Ответ 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);