Всем привет! Метод sumDigitsInNumber должен возвращать сумму цифр полученного числа (546), но вместо этого возвращает сумму кодов чисел из таблицы ASCII(возвращает 159, сумма кодов 53 + 52 + 54), изучаю Java меньше недели и никак не могу понять в чем проблема, пытался гуглить, но ничего не нагуглил. Помогите пожалуйста)
P.S. столкнулся с проблемой не только в этой программе, для себя написал программу "угадай число" и там при вводе числа с клавиатуры через BufferedReader тоже возвращался код символа(
Заранее всем спасибо!)
public class Solution {
public static void main(String[] args) {
System.out.println(sumDigitsInNumber(546));
}
public static int sumDigitsInNumber(int number) {
String s = Integer.toString(number);
char[] chars = s.toCharArray();
number = 0;
for (int i = 0; i < chars.length; i++) {
number += (int) chars[i];
}
return number;
}
}
Делал буквально на днях, но двумя другими способами. Здесь используются мои имена пакетов.
Основной класс SumOfDigits.java:
package info.sjd;
import java.util.logging.Logger;
import info.sjd.service.SumOfDigitsService;
public class SumOfDigits {
private static Logger logger = Logger.getLogger(SumOfDigits.class.getName());
public static void main(String[] args) {
int number = 12345;
int sumOfDigitsByIntegerDivision = SumOfDigitsService.sumOfDigitsByIntegerDivision(number);
int sumOfDigitsByCharSplitting = SumOfDigitsService.sumOfDigitsByCharSplitting(number);
logger.info("The sum of digits of number " + number + " by integer division is " + sumOfDigitsByIntegerDivision);
logger.info("The sum of digits of number " + number + " by character splitting is " + sumOfDigitsByCharSplitting);
}
}
Сервисный класс SumOfDigitsService.java:
package info.sjd.service;
public class SumOfDigitsService {
public static int sumOfDigitsByIntegerDivision(int number) {
int sumOfDigits = 0;
while (number > 0) {
sumOfDigits = sumOfDigits + (number % 10);
number = number / 10;
}
return sumOfDigits;
}
public static int sumOfDigitsByCharSplitting(int number) {
int sumOfDigits = 0;
String stringNumber = String.valueOf(number);
for (int i = 0; i < String.valueOf(number).length(); i++) {
sumOfDigits = sumOfDigits + Integer.parseInt(String.valueOf(stringNumber.charAt(i)));
}
return sumOfDigits;
}
}
В вашем случае скорее всего нужно будет разобраться с приведением типов и возможно использовать переопределение метода .toString()...
========== ОБНОВЛЕНО =================
Да, с приведением типов разберитесь. Все работает, если так: package info.sjd;
public class Solution {
public static void main(String[] args) {
System.out.println(sumDigitsInNumber(546));
}
public static int sumDigitsInNumber(int number) {
String s = Integer.toString(number);
char[] chars = s.toCharArray();
number = 0;
for (int i = 0; i < chars.length; i++) {
number += Integer.parseInt(String.valueOf(chars[i]));
}
return number;
}
}
Каст char
в int
возвращает код символа, а не его цифровое значение. Это задокументированное поведение. Для получения численного значения можно использовать Character.getNumericValue(char)
.
Адаптация алгоритма из вопроса:
public static int sumDigitsInNumber(int number) {
int sum = 0;
for (char c : Integer.toString(number).toCharArray()) {
sum += Character.getNumericValue(c);
}
return sum;
}
Другой подход:
public class Solution {
public static void main(String[] args) {
System.out.println(sumDigitsInNumber(546)); // 15
}
public static int sumDigitsInNumber(int number) {
int sum = 0;
while (number > 0) {
sum += number % 10;
number /= 10;
}
return sum;
}
}
Объяснение:
number % 10
-- возвращает последную цифру числа: для 546 -- 6, для 15 -- 5.number /= 10
-- уменьшает число на 1 цифру: 546 -> 54, 15 -> 1Можно использовать Stream
из java8:
public static int sumDigitsInNumber(int number) {
return Arrays
.stream(Integer.toString(number).split("")) // Конвертирование в массив String
.mapToInt(Integer::parseInt) // Конвертирование каждой строки в число
.sum(); // Подсчет суммы
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
У меня есть examplexhtml, я не знаю как правильно его заполнить, так как NetBeans предлагает один вариант, а видео, где все работает, заполняют по-другому
Есть массив объектовНужно получить на выходе сколько у каждого юзера completed