#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();