Программа возвращает код символа а не сам символ

198
20 марта 2019, 12:40

Всем привет! Метод 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;
    }
}
Answer 1

Делал буквально на днях, но двумя другими способами. Здесь используются мои имена пакетов.

Основной класс 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;
    }
}
Answer 2

Каст char в int возвращает код символа, а не его цифровое значение. Это задокументированное поведение. Для получения численного значения можно использовать Character.getNumericValue(char).

Answer 3

Адаптация алгоритма из вопроса:

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();                                     // Подсчет суммы
}
READ ALSO
Asset, WebView и редактирование файлов

Asset, WebView и редактирование файлов

Есть WebViewВ него загружается index

143
Использование, связка бинов в Java

Использование, связка бинов в Java

У меня есть examplexhtml, я не знаю как правильно его заполнить, так как NetBeans предлагает один вариант, а видео, где все работает, заполняют по-другому

153
JS. Внутренняя память

JS. Внутренняя память

Сколько байтов в куче занимает объявление функции в JS?

148
Перебрать массив объектов

Перебрать массив объектов

Есть массив объектовНужно получить на выходе сколько у каждого юзера completed

152