Возьмите строку и разделите ее на 2 числа и оператор

#java

#java

Вопрос:

Я пытаюсь создать проект, в котором пользователь вводит простой математический вопрос (например, 14 3), и программа собирается что-то сделать (не имеет значения). Для этого «чего-то» мне нужно первое число и второе число как два разных целых числа, а также оператор как символ. Итак, я попробовал этот код:

 String str = "";
str = scan.next();
str.replaceAll(" ","");

int ans = 0;
int len = str.length();
int pos = 0;

String str1 = "";
char opr = ' ';
String str2 = "";

int i;
for (i = 0 ; i < len ; i  )
{
    if (str.charAt(i) <= '9' amp;amp; str.charAt(i) >= '0') 
    {
        pos = i;
        str1 = str1   str.charAt(i);
    }
    else
        break;
}

opr = str.charAt(i);

for (int j = i   1 ; j < len - i ; i  )
{
    if (str.charAt(i) <= '9' amp;amp; str.charAt(i) >= '0') 
        str2 = str2   str.charAt(i);
}

int n1 = Integer.parseInt(str1);
int n2 = Integer.parseInt(str2);

  

Я получаю эту проблему:
Исключение в потоке «main» java.lang.Исключение StringIndexOutOfBoundsException: индекс строки вне диапазона: 2 в java.lang.String.charAt(неизвестный источник)

Кто-нибудь может объяснить, в чем проблема с моим кодом? Кстати, я совсем новичок в Java и лучше разбираюсь в c .

Комментарии:

1. Обратите внимание, что str.replaceAll(" ",""); это не делает того, что вы думаете. Это выражение — оно не изменяет строку. Строка неизменяема — все операции, определенные над ней, создают новый объект, а не изменяют исходный объект. Поэтому вам нужно присвоить ее обратно str ( str = str.replace(...) ) .

2. если это «реальная» задача (не домашнее задание), то вы должны использовать регулярные выражения

3. Пожалуйста, не задавайте здесь вопросы о задании / домашнем задании в колледже.

4. @SharonBenAsher Если это «реальная» задача, они должны использовать анализатор выражений, а не регулярное выражение.

5. @AsadChoudhary Спрашивать о проблеме с кодом вполне допустимо, домашнее задание или нет. Проблемы с домашним заданием связаны с затратами усилий и отладкой.

Ответ №1:

Я даю решение для вашей основной причины, используя регулярное выражение.

     String s="3*4 5";
    String s1[]=s.split("[[ ]-[*]/]");//put all the required symbols 
    System.out.println(s1[0]);//prints 3
    System.out.println(s1[1]);//prints 4
    System.out.println(s1[2]);//prints 5
  

Примечание: ‘ ‘ и ‘*’ являются специальными символами регулярных выражений, поэтому я заключил их в ‘[]’.

Ответ №2:

Вы получите ошибку в этой строке opr = str.charAt(i); , потому что, если цикл for не прерывается, i=len и str.charAt(len) превышает длину str .

Комментарии:

1. И его логика для получения операции неверна. Он вычисляет неправильную позицию, а код копирования вставки во 2-м цикле делает его логику неправильной дважды: P

Ответ №3:

Пожалуйста, проверьте это решение. Этот фрагмент кода разобьет строку на 2 массива, один из которых содержит целые числа, а другой — математические операции char

     String str = "14 58*81*95D";
    String s1[]=str.split("(?=[/* %])|(?<=[/* %])");

    ArrayList<String> mathamaticalOpertaorsList=new ArrayList<String>();
    ArrayList<Integer> numbersList=new ArrayList<Integer>();

    for(int i=0;i<s1.length;i  ) {
        if(i%2==1) {
            mathamaticalOpertaorsList.add(s1[i]);
        }
        else {
            numbersList.add(Integer.parseInt(s1[i]));
        }
    }

    char[] mathOpertaorschars = mathamaticalOpertaorsList.toString().toCharArray();