Строковой калькулятор, проблема с операциями при сложение строк (java)
Подскажите пожалуйста при вводе строки с помощью Scanner
к примеру "Привет/" + "мир"
я получаю следующую ошибку:
Введите любую строку: "Привет/" + "мир"
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at CalculatorString.calculateStringResult(CalculatorString.java:42)
at CalculatorString.main(CalculatorString.java:10)
Process finished with exit code 1
Проблема в том, что я складываю две строки массива, разделение должен быть по " + "
, а получил разделение по /
который стоит после слова Привет
-> "Привет/"
.
Как лучше исправить эту проблему? Изменить во всех кейсах разделитель? Или можно как то игнорировать каким-то методом лишние знаки +
, -
, /
и *
которые могут попасть в первую или вторую строку над которыми нужно провести операцию.
Буду благодарен за совет по улучшению кода!
public class CalculatorString {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Введите любую строку: ");
String string = scanner.nextLine();
string = string.replace("\"", "").trim();
try {
System.out.println(calculateStringResult(string));
} catch (NumberFormatException e) {
System.err.println("Нельзя число делить и умножать на строку!");
}
}
public static String calculateStringResult(String stringResult) throws NumberFormatException{
StringBuilder modifiedStr = new StringBuilder();
char symbol;
char firstSymbol;
char lastSymbol;
String[] arrString;
int elementsArrString;
for (int i = 0; i < stringResult.length(); i++) {
symbol = stringResult.charAt(i);
firstSymbol = stringResult.charAt(0);
lastSymbol = stringResult.charAt(stringResult.length() - 1);
switch (symbol) {
case '+':
arrString = stringResult.trim().split(" \\+ ");
if (arrString[0].length() > 10 || arrString[1].length() > 10) {
System.err.println("Одна из строк превышает допустимую длинну 10 символов");
} else if (Character.isDigit(firstSymbol) || Character.isDigit(lastSymbol)) {
System.err.println("Первый или последний аргумент не должен быть числом!");
} else {
modifiedStr.append(arrString[0].concat(arrString[1])).insert(0, "\"").insert(modifiedStr.length(), "\"");
}
break;
case '/':
arrString = stringResult.trim().split(" / ");
elementsArrString = Integer.parseInt(arrString[1]);
if (arrString[0].length() > 10) {
System.err.println("Одна из строк превышает допустимую длинну 10 символов");
} else if (Character.isDigit(firstSymbol)) {
System.err.println("Первый аргумент не должен быть числом!");
} else if (elementsArrString < 0 || elementsArrString > 10) {
System.err.println("Число должно быть от 1 до 10");
} else {
for (int j = 0; j < arrString[0].length() / elementsArrString; j++) {
symbol = arrString[0].charAt(j);
modifiedStr.append(symbol);
}
modifiedStr.insert(0, "\"").insert(modifiedStr.length(), "\"");
}
break;
case '*':
arrString = stringResult.trim().split(" \\* ");
elementsArrString = Integer.parseInt(arrString[1]);
if (arrString[0].length() > 10) {
System.err.println("Одна из строк превышает допустимую длинну 10 символов");
} else if (elementsArrString < 0 || elementsArrString > 10) {
System.err.println("Число должно быть от 1 до 10");
} else if (Character.isDigit(firstSymbol) || !Character.isDigit(lastSymbol)) {
System.err.println("Первый аргумент не должен быть числом!");
} else {
modifiedStr = new StringBuilder(elementsArrString * arrString[0].length());
modifiedStr.append(arrString[0].repeat(elementsArrString)).insert(0, "\"").insert(modifiedStr.length(), "\"");
}
break;
case '-':
arrString = stringResult.trim().split(" - ");
elementsArrString = arrString[0].indexOf(arrString[1]);
if (arrString[0].length() > 10 || arrString[1].length() > 10) {
System.err.println("Одна из строк превышает допустимую длинну 10 символов");
} else if (Character.isDigit(firstSymbol) || Character.isDigit(lastSymbol)) {
System.err.println("Оба аргумента должны быть строками!");
} else {
if (elementsArrString == -1) {
modifiedStr.append(arrString[0]);
} else {
String oneStrMinusSecondStr = arrString[0].substring(0, elementsArrString);
oneStrMinusSecondStr += arrString[0].substring(elementsArrString + arrString[1].length());
modifiedStr.append(oneStrMinusSecondStr).insert(0, "\"").insert(modifiedStr.length(), "\"");
}
}
break;
}
}
if (modifiedStr.length() > 40) {
String endStr = "..." + "\"";
return modifiedStr.insert(0, "\"").substring(0, 40).concat(endStr);
} else {
return modifiedStr.toString().trim();
}
}
}```
Ответы (1 шт):
Добавить
case '"':
i++;
while(stringResult.charAt(i) !='"' && i < stringResult.length()) {i++;}
break;
но в целом все написано неправильно. Подробнее раскажут в Code Review.