сумма целых чисел в строке - PullRequest
0 голосов
/ 03 марта 2020

Учитывая строку, анализирует целые числа и суммирует ее

Так вот код, который я написал до сих пор в java

public static int find(String s) {
    int sum = 0;
    String temp = "";

    //loop through string
    for(int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        //chracter is a digit then we store the digit in a Temporary String
        //loop through the next character, if its a digit again then we add the digit to temp
        //if the next character is not a digit then we sum up the digits and reset temp back to zero to recalculate new ints
        if(Character.isDigit(c)) {
            temp = temp + c;
        } else {
            sum = sum + Integer.parseInt(temp);
            temp = "0";
        }
    }

    return sum + Integer.parseInt(temp);
}

String s = "12he123sd-2";

//should give me 133
//but the negative sign isn't being parsed

Я попытался добавить новый иначе, если блок, но он не работает

else if (c == '-')  temp = temp + c;

или

else if (c == '-' && Character.isDigit(c+1)) 
   temp = temp + c;

Ответы [ 2 ]

4 голосов
/ 03 марта 2020

Первое, что приходит мне в голову, это решить это с помощью регулярных выражений. Это то, что вы хотите?

public static int find(String s) {
    int sum = 0;
    Matcher m = Pattern.compile("(-?\\d+)").matcher(s);
    while (m.find()) {
        sum += Integer.parseInt(m.group(1));
    }
    return sum;
}
3 голосов
/ 03 марта 2020

Если вы хотите сделать это без регулярных выражений, вы можете изменить свой подход следующим образом:

    public static void main(String[] args) {
                  //       123 + 32 - 23 - 1 - 0 + 211 = 342
        int sum = find("sum123the32num-23-1be-0rs211found-done");
        System.out.println(sum);
    }

    public static int find(String s) {
        int sum = 0;
        int temp = 0;
        int sign = 1;
        // loop through string
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                // was previous character a negative sign
                if (i > 0 &&  s.charAt(i-1) == '-') {
                    sign = -1;
                }
                // subtract '0' to convert char to binary
                // then convert entire number to binary 
                temp = temp * 10 + c - '0';
            } else {
                // non digit encountered so add to sump
                sum = sum + (sign * temp);
                System.out.println("sum = " + sum);
                temp = 0;
                sign = 1;
            } 
        }

        return sum;
    }

Необходимо объяснить несколько вещей, помимо комментариев программы.

  1. Символ 1 в ASCII, поэтому его необходимо преобразовать в значение int 1, чтобы быть полезным. Это может быть сделано путем вычитания 0 из него и из всех цифр других встречающихся цифр.
  2. Чтобы преобразовать число последовательных цифр в полное число, выполните следующие действия. В качестве примера используйте «927»

    • set temp = 0;
    • temp = temp * 10 + c - '0'; // first time thru temp = 9
    • temp = temp * 10 + c - '0'; // now temp = 92
    • temp = temp * 10 + c - '0'; // now temp = 927
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...