Не могу присвоить в переменную значение "+", считанное Scannerом

188
01 сентября 2021, 22:00

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

Буду очень благодарен, если кто подскажет в чём трабл с + заключается. Интернет рыл, ничего подобного не нашёл.

package CalcCons;
import java.util.Scanner;
public class CalculatorConsole {
    public static void main(String[] args) {
        Input myInput = new Input(); // объект класса ввода выражения
        CalcAction myCalcAction = new CalcAction(); // Объект расчёта выражения
        myInput.Input(); // Вызов ввода выражения
        myCalcAction.CalcAction(); // Вызов расчёта выражения
    }
}
class Input {
    public void Input() {
        System.out.println("Введите выражение:");
        Scanner in = extracted().useDelimiter("[,\\s+]"); //  Считывание строки
        proverkaRome(in); // Проверка: арабские или римские числа введены 
        if (Example.value[3] == "1") { // если это не целые числа, то 
            converterRome();
        } else 
        {       
        MathTrue();        
        }
    }
    private void proverkaRome(Scanner in) {
        boolean Rome1 = false;
        boolean Rome2 = false;
        if(in.hasNextInt()) {
            Example.value[0] = in.next();
            } else {
                Rome1 = true;
                Example.value[0] = in.next();
            }
        Example.value[1] = in.next();
        if(in.hasNextInt()) {
            Example.value[2] = in.next();
            } else {
                Rome2 = true;
                Example.value[2] = in.next();
            }
        if (((Rome1 == false) && (Rome2 == true))  || ((Rome2 == false) && (Rome1 == true))) {
            System.out.println("Введено недопустимое выражение");
            System.exit(0); 
        }
        if ((Rome1 == true) && (Rome2 == true)) {
            Example.value[3] = "1";
     }
    }
    private void converterRome() { // конвертация римских чисел в арабские
        String firstRome =  Example.value[0]; //присваиваем значения из скана
        String secondRome =  Example.value[2];  
        // Массив с римскими числами:
        String[] rome = {"0","I","II","III","IV","V","VI","VII","VIII","IX","X"};
        boolean rome1 = false, rome2 = false;
        //сравниваем считанные из скана значения со значениями из массива
        for (int i = 1; i < 11; i++) {
            if (firstRome.equals(rome[i])) { // конвертируем римские числа в арабские и ставим галочку
                 Example.value[0] = String.valueOf(i);;
                 rome1 = true;
            }
            if (secondRome.equals(rome[i])) {
                 Example.value[2] = String.valueOf(i);
                 rome2 = true;
            }
        }
        if ((rome1 == false) || (rome2 == false)) { // Если оба числа не оказались римскими, то 
            System.out.println("Введено недопустимое выражение");
            System.exit(0); 
        }

            MathTrue();
    }

    private Scanner extracted() {
        return new Scanner(System.in);
    }
    private static void MathTrue() {

        int a = Integer.parseInt(Example.value[0]);
        int c = Integer.parseInt(Example.value[2]);
        if ((a > 10) || (a < 1) || (c > 10) || (c < 1)) {
            System.out.println("Введено недопустимое выражение; Я умею считать только числа от 1 до 10");
            System.exit(0); 
        }
        int index1 = Example.value[1].indexOf('+');
        int index2 = Example.value[1].indexOf('-');
        int index3 = Example.value[1].indexOf('*');
        int index4 = Example.value[1].indexOf('/');
        if ((index1 == -1) && (index2 == -1) && (index3 == -1) && (index4 == -1)) {
            System.out.println("Введено недопустимое выражение; Я не знаю такого оператора");
            System.exit(0); 
        }
    }

}
class CalcAction {
    public void CalcAction() {
    int first, second;
    first = Integer.parseInt(Example.value[0]);
    second = Integer.parseInt(Example.value[2]);
    int answer = 0;
        switch(Example.value[1]) {
            case("+"):
                answer = Summa(first, second);
                break;
            case("-"):
                answer = Subtraction(first, second);
                break;
            case("*"):
                answer = Multiplication(first, second);
                break;
            case("/"):
                answer = Division(first, second);
                break;
        }
        if (Example.value[3] == "0") {
        System.out.println(answer);
        } else {
            reConverter(answer);
        }
    }
    private static int Summa(int first, int second) {   
        return (first + second);        
    }
    private static int Subtraction(int first, int second) {     
        return (first - second);        
    }
    private static int Multiplication(int first, int second) {      
        return (first * second);        
    }
    private static int Division( int first, int second) {       
        return(first / second);
    }
    private static void reConverter(int answer) {
         String[] rome = {"0","I","II","III","IV","V","VI","VII","VIII","IX","X"};
         for (int i = 1; i < 11; i++) {
                if (answer == i) {
                     System.out.println(rome[i]);
                     }
         }
    }
}
class Example {
    public static String[] value = {"0","0","0","0"};
}
Answer 1

Класс Input, метод Input(). В строке:Scanner in = extracted().useDelimiter("[,\\s+]"); исправьте регулярное выражение. Уберите плюс и оставьте [,\\s] Так все работает.

Небольшой совет. Логическое выражение if (((Rome1 == false) && (Rome2 == true)) || ((Rome2 == false) && (Rome1 == true))) легко упрощается до вот такого вида: if (!Rome1 && Rome2 || !Rome2 && Rome1)

READ ALSO
динамическое добавление input с уникальным id

динамическое добавление input с уникальным id

Передо мной стоит задача по нажатию добавлять input с кнопкой удаления этого инпутаМаксимальное кол-во инпутов 4

257
Как удалить комментарии из DOM дерева?

Как удалить комментарии из DOM дерева?

Пытаюсь удалить комментарии из контейнера, так как потом работаю с потомками этого контейнера используя firstChild в циклеУдаляю ненужных потомков...

145