Сложение символов в Java
Есть задача на счастливый билетик. Получаем на вход строку "123456" (строка содержит 6 целых цифр) и выводим "Счастливый" если сумма трёх первых и трех последующих чисел равны, иначе "Обычный билетик" (допустим).
На ум приходит мысль о преобразовании строки в массив символов и последующее преобразование содержимого массива в целочисленную переменную, ну и произвести сложение в нужном порядке. Это работает, всё отлично.
Есть более изящное для этого случая решение, это всего лишь перевести строку в массив символов и сложить символы в соответствии с таблицей системы Windows:
0 - 48
1 - 49
2 - 50
3 - 51
4 - 52
5 - 53
6 - 54
7 - 55
8 - 56
9 - 57
Вот собственно рабочий код:var scan = new Scanner(System.in); String number = scan.next(); char[] ch = number.toCharArray(); System.out.println(ch[0] + ch[1] + ch[2]); System.out.println(ch[3] + ch[4] + ch[5]); System.out.println(ch[0] + ch[1] + ch[2] == ch[3] + ch[4] + ch[5] ? "Lucky" : "Regular");
Как это работает: получаем строку "090234", складываем десятичные коды символов 48 + 57 + 48 = 153
50 + 51 + 52 = 153. Вроде как для этой задачи всё гладко и понятно. Но теперь самое интересное, почему когда я вывожу результат сложение символов через принт, то он даст результат рассчитанный выше, но если вывести цифру, например '6' результат будет 6? Вот пример:
System.out.print('2' + '3'); // 101
System.out.print('6'); // 6
Ответы (3 шт):
При сложении символы переводятся в соответствие с таблицей кодировки, чтобы не возникала переполнения, и выводится результат, соответственно, по таблице
System.out.print('2' + '3'); // 101
Если вам надо получить символ, то можете использовать явное преобразование типов
System.out.println((char)('2'+'3')); // e
Но надо учитывать, что выведется символ соответствующий цифровому представлению в кодировке, то есть '2' + '3' = 101 = e, а НЕ '2' + '3' = '5'.
Когда же вам надо вывести отдельный символ, то он выведется просто как символ, не переводясь в кодировку
System.out.print('6'); // 6
Если же вам надо вывести код одного символа, то так же можно использовать явное преобразование
System.out.println((int)'6'); // 54
Потому что при сложении 2-х char результат автоматически преобразуются в int ,чтобы избежать переполнения.
В первом случае при сложении char преобразуется в int и соответственно печатается число.
Во втором случае это константа типа char - она и печатается.
Так же стоит добавить что char является целочисленным типом
Потому, что вызывается перегруженный метод PrintStream::print(int).
Печатает целое число. Строка, созданная
String.valueOf (int), преобразуется в байты в соответствии с кодировкой символов платформы по умолчанию, и эти байты записываются точно так же, как методwrite (int).
То есть в зависимости от типа аргумента вызывается соответствующий метод. В первом случае тип аргумента int, получается как результат вычисления выражения, а во втором - char.
Вот его описание PrintStream::print(char)
Печатает символ. Символ преобразуется в один или несколько байтов в соответствии с кодировкой символов платформы по умолчанию, и эти байты записываются точно так же, как метод
write (int).
Теперь нетрудно заметить разницу.