2013-12-24 3 views
0

Я пишу следующий код, который будет читать строку, преобразовывать их в целое число и подсчитывать, сколько четных, нечетных и нулевых цифр в строке.Получение неправильного результата после сравнения данных

Но проблема в том, что всякий раз, когда я ввожу ноль, он будет делать расчет в countEven в моем коде, а не countZero.

Что случилось с моим кодом?
У меня нет проблем с подсчетом цифр и нечетных цифр в моем коде, это всего лишь нули.

Scanner stdin = new Scanner(System.in); 
    String str = ""; 
    int countOdd = 0, countEven = 0, countZero = 0; 

    str = stdin.nextLine(); 
    char[] breakDown = str.toCharArray(); 

    Integer convertInt; 


    for (int i = 0; i < breakDown.length; i++) { 
     convertInt = new Integer(breakDown[i]); 

     if (convertInt % 2 == 1) 
      countOdd++; 

     if (convertInt % 2 == 0 && convertInt != 0) 
      countEven++; 

     if (convertInt == 0) 
      countZero++; } 

ответ

3

Когда вы приводите характер '0' до целого, становится 48, а не 0. Выражение breakDown[i] имеет тип char, но это становится приведение к int, когда вы передаете его в Integer конструктор.

Вы можете просто избавиться от конверсии до Integer и написать это внутри своей петли.

if (breakDown[i] % 2 == 1) { 
     countOdd++; 
    } 

    if (breakDown[i] % 2 == 0 && breakDown[i] != '0') { 
     countEven++; 
    } 

    if (breakDown[i] == '0') { 
     countZero++; 
    } 
+0

Да, это лучшее решение, чем мое, это работает, потому что коды ASCII цифр 0-9 находятся между 0x30 и 0x39. Так, например, 1 - 0x31, и это нечетно. – lwi

+0

А я вижу !!! Спасибо и спасибо lwi^_^Другими словами, он преобразует символ «0» в код ASCII, а не напрямую преобразует его в тип int, правильно? Еще один вопрос: тип char (breakdown [i]) можно разделить по числам, если эти символы являются числами, правильно? – user2789240

+0

Если вы попытаетесь сделать арифметику с символом 'char', это будет рассматриваться как число. Он не должен находиться в диапазоне от «0» до «9». –

1

Проблема у вас есть в вашем коде, что new Integer(breakDown[i]) возвращает значение кода ASCII, а не фактическое значение цифры. Поэтому он возвращает 0x30, это даже и ваш код правильно увеличивается countEven и не countZero.

Первое решение в моем сознании, вместо этого используйте Integer.valueOf(breakDown[i]-0x30).

Смежные вопросы