Java split не может заставить его работать для отрицательных чисел - PullRequest
0 голосов
/ 05 августа 2020

Мой профессор попросил нас сделать простой калькулятор для сложения и вычитания, но на входе должно быть целое выражение типа «5-5», «60 + 70» или «-8 + 10».

Scanner console = new Scanner(System.in);

int sum;

String expression = console.nextLine();
String[] split = expression.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)");

int a = Integer.parseInt(split[0]);
int b = Integer.parseInt(split[2]);

String operator = split[1];

switch (operator) {

    case "+":
        sum = a + b;
        System.out.println(sum);
        break;

    case "-":
        sum = a - b;
        System.out.println(sum);
        break;
}

Это мой код, и он работает для первых двух примеров, но не для последнего, где первое целое число является отрицательным, например «-8 + 10», и нет, я не могу сделать это другим способом. Мне нужно ввести все выражение в одну строку.

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Вы можете заменить свое регулярное выражение на (?<=\\d)(?=\\D). Это ищет вхождения пар (non di git) (di git).

Для ваших примеров:
5-5 => «5» и «-5»
60 + 70 => «60» и «+70»
-8 + 10 => «-8» и «+10»

    int sum;
    Scanner console = new Scanner(System.in);

    String expression = console.nextLine();
    String[] split = expression.split("(?<=\\d)(?=\\D)"); //split by signed numers

    int a = Integer.parseInt(split[0]); //First numer at index 0
    int b = Integer.parseInt(split[1]); //Second numer at index 1

    sum = a + b; //You don't need operator. Instead just add a and b
    System.out.println(sum);

Вы можете избавиться от operator. Обратите внимание: если a или b будет отрицательным, вы все равно можете просто добавить их, чтобы получить правильный результат.

0 голосов
/ 05 августа 2020

Вы можете исправить это, всегда начиная с 0 и применяя каждую «часть» как число или оператор. Это решение также допускает произвольную длину, поэтому вы не ограничены только двумя числами.

import java.util.*;
import java.util.stream.*;

public class Main {
  public static void main(String[] args) {
    System.out.println(new Expression("-8+12").evaluate());
  }
}

class Expression {

  public List<Part> parts;

  public Expression(String expression) {
    String[] split = expression.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)");
    this.parts = Stream.of(split).map(Part::new).collect(Collectors.toList());

  }

  public Double evaluate() {
    double total = 0;
    Operator currentOperator = new Operator("+");
    
    for (Part currentPart : parts) {
      if (currentPart.isNumber()) {
        total = currentOperator.apply(total, currentPart.getNumberValue());
      } else {
        currentOperator = new Operator(currentPart.value);
      }
    }
    
    return total;
  }

}

class Part {

  public String value;

  public Part(String value) {
    this.value = value;
  }

  public double getNumberValue() {
    return Double.parseDouble(this.value);
  }

  public boolean isNumber() {
    try {
      double number = Double.parseDouble(this.value);
      return true;
    } catch (Exception e) {
      return false;
    }
  }
}

class Operator {
  public String value;

  public Operator(String value) {
    this.value = value;
  }

  public double apply(double first, double second) {
    switch(this.value) {
      case "+":
        return first + second;
      case "-":
        return first - second;
      default:
        throw new RuntimeException("Not a valid operator");
    }
  }
}

Вы можете поиграть с этим решением здесь .

...