Как определить 2 отдельных двузначных числа в строке? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь найти способ идентифицировать 1 или 2-значные числа в string (не может быть 3-значных чисел), сложить их вместе, чтобы они были в диапазоне от 80 до 95.

По какой-то причине код не работает, так как он всегда возвращает false, даже когда он (теоретически) должен возвращать true.

ex.«Hi 57 how are you 30» возвращает false

Заранее благодарим за помощь!

("line" is the name of the String.)

public boolean isDig(){
    int total=0;
    int h;
    int length = line.length();
    for(h=0; h < length-1; h++) {
        if (Character.isDigit(line.charAt(h))){
            if (Character.isDigit(line.charAt(h+1))){
                if (Character.isDigit(line.charAt(h+2))){
                    return false;
                }
                else {
                    total= total+(line.charAt(h)+line.charAt(h+1));
                    h++;
                }
            }
            else {
                total= total+(line.charAt(h)); 
            }
        }

    if (total>=80 && total<=95){
        return true;
    }
    else {
        return false;
        }   
}

Ответы [ 5 ]

0 голосов
/ 19 января 2019

Вы можете преобразовать строку в массив и проверить, является ли каждый элемент строки (разделенный пробелом) цифрой, протестировав метод Integer.parseInt () для каждого элемента строки.Вот пример ниже:

public static boolean isDig(String theString) {
    String[] theStringArray = theString.split(" ");
    ArrayList<Integer> nums = new ArrayList<Integer>();
    for(int x = 0; x < theStringArray.length; x++) {
        String thisString = theStringArray[x];
        try {
            int num = Integer.parseInt(thisString);
            nums.add(num);
        }catch(NumberFormatException e) {
            continue;
        }
    }
    int total = 0;
    for(int num: nums) {
        total += num;
    }
    if(total >= 80 && total <= 95) {
        return true;
    }
    else {
        System.out.println(total);
        return false;
    }
}

Сначала мы разбиваем исходную строку на массив, основанный на пустых местах.Затем мы создаем ArrayList, который добавит к нему каждую цифру в строке.Затем мы создаем цикл for для просмотра каждой отдельной строки в массиве и устанавливаем блок try-catch.Если мы можем преобразовать цифру в int с помощью метода Integer.parseInt (), мы добавим ее в ArrayList.Если нет, мы перехватим исключение и продолжим цикл с помощью оператора continue.Как только мы вырвемся из цикла, мы можем создать переменную под названием «total» и создать еще одну для цикла, чтобы добавить каждую цифру в ArrayList к общей сумме.Если сумма больше / равна 80 и меньше / равна 95, мы вернем True, иначе вернем false.Давайте проверим код:

String digitTest = "There is a digit here: 50 and a digit here 45";
System.out.println(isDig(digitTest));

Числа 50 и 45 должны равняться 95, и наш результат:

true
0 голосов
/ 18 января 2019

Пусть java.util.Scanner сделает работу:

public boolean scan(String line) {
    Scanner scanner = new Scanner(line);
    scanner.useDelimiter("\\D+");
    int a = scanner.nextInt();
    int b = scanner.nextInt();
    int sum = a + b;
    return sum >= 80 && sum <= 95;
}

Вызов .useDelimiter("\\D+") отделяет строку в регулярном выражении, соответствующем нецифровым символам, поэтому nextInt находит следующее целое число. Вам придется немного его настроить, если вы хотите подобрать отрицательные целые числа.

0 голосов
/ 18 января 2019

Вы должны использовать регулярное выражение для этого вида синтаксического анализа:

public class Example {

    public static void main(String[] args) {
        String input = "Hi 57 how are you 30";
        System.out.println(process(input));
    }

    private static boolean process(String input) {
        Pattern pattern = Pattern.compile(".*?(\\d+).*?(\\d+)");
        Matcher matcher = pattern.matcher(input);

        if (matcher.matches()) {
            int one = Integer.parseInt(matcher.group(1));
            int other = Integer.parseInt(matcher.group(2));
            System.out.println(one);
            System.out.println(other);

            int total = one + other;
            return total >= 80 && total <= 95;
        }

        return false;
    }
}

Выход:

57

30

правда

0 голосов
/ 18 января 2019

Одно из возможных решений это использовать Регулярное выражение .

public static boolean isValid(String str) {
    // regular expression matches 1 or 2 digit number
    Matcher matcher = Pattern.compile("(?<!\\d)\\d{1,2}(?!\\d)").matcher(str);
    int sum = 0;

    // iterate over all found digits and sum it
    while (matcher.find()) {
        sum += Integer.parseInt(matcher.group());
    }

    return sum >= 80 && sum <= 95;
}
0 голосов
/ 18 января 2019

Основная проблема в коде состоит в том, что line.charAt(h) не является числовым значением цифры в позиции h. Это значение кодовой точки, например '0' равно 48.

Самый простой способ получить числовое значение - Character.getNumericValue(line.charAt(h)), и аналогично в других местах.

Вам также не хватает умножения на 10 первой цифры в паре.


Предполагая, что вы знаете, что строка корректна, достаточно просто сложить любые числа в строке. Тот факт, что они состоят из 2 или 3 цифр, не имеет большого значения с точки зрения получения суммы.

int total = 0;
for (int i = 0; i < line.length(); ) {
  // Skip past non-digits.
  while (i < line.length() && !Character.isDigit(line.charAt(i))) {
    ++i;
  }

  // Accumulate consecutive digits into a number.
  int num = 0;
  while (i < line.length() && Character.isDigit(line.charAt(i))) {
    num = 10 * num + Character.getNumericValue(line.charAt(i));
  }

  // Add that number to the total.
  total += num;
}
...