Строка формулы умножения - Java

Я пытаюсь написать код, который принимает строку: (7+5)*(6+9)и вернуть строку: 7*6 + 7*9 + 5*6 + 5*9Мой алгоритм состоит в том, чтобы создать 2 массива символов (для этого примера: 75,69) и запустить в цикле O^2 в этих 2 массивах и скопировать значение из первого массива, * значение из второго массива, +. я получаю индекс исключений границ и не понимаю почему.

это мой код:

 String s = "((7+5)*(6+9))";

 char[] ch = s.toCharArray();
 char[] newCh = new char[30];
 int j=0;
 int blocks = 2;
 int newi = 0;

 for (int i=0 ; i<ch.length ; i++) {
    if (ch[i]=='(' && ch[i+1]!='(') {
        j=i+1;
        while (blocks>0) {

            if (ch[j]==')') {
                blocks--;
                newCh[newi]='-';
                newi++;

            }
            if (ch[j]!='+' && ch[j]!='*' && ch[j]!=')' && ch[j]!='(') {
                if (blocks==0) {

                    break;
                }
                else {

                    newCh[newi]=ch[j];
                    newi++;
                }

            }
            j++;
        }

    }
    continue;
 }

 System.out.println("new Char array : ");
 for (int i=0 ; i<newCh.length ; i++) {
     System.out.print(newCh[i]);
 }
 System.out.println();

 Multy(newCh);

и мой многоликый метод:

public static char[] Multy(char[] ch) {
 char[] newc = new char[50];
 char[] c1 = new char[30];
 char[] c2 = new char[30];
 int newi = 0;
 int i1 = 0;
 int i2 = 0;
 int flag = 0;

 for (int i=0 ; i<ch.length ; i++) {
     if (ch[i]!='-') {
         if (flag ==0) {
        c1[i1] = ch[i];
        i1++;
         }
         else {
             if (ch[i]!='-')
             c2[i2]= ch[i];
             i2++;
         }
     }
     if (ch[i]=='-')
         flag = 1;

 }
 System.out.println("In func");

 System.out.print("c1 : ");
 for (int i=0 ; i<c1.length ; i++) {
     System.out.print(c1[i]);
 }
 System.out.println();
 System.out.print("c2 : ");
 for (int i=0 ; i<c1.length ; i++) {
     System.out.print(c2[i]);
 }
 ///////////


 for (int i=0 ; i<c1.length ; i++) {
    for (int j=0 ; j<c2.length ; j++) {
        newc[newi]=c1[i];

        newc[newi+1] = '*';

        newc[newi+2] = c2[j];

        newc[newi+3] = '+';

        newi+=4;


    }
 }

 System.out.print("NEWc2 : ");
 for (int i=0 ; i<newc.length ; i++) {
     System.out.print(newc[i]);
 }


 return newc;

}

1 ответ

Решение

В двойном цикле for вы выполняете итерацию до конца массива (c1.length и c2.length), в то время как добавляете к числу в цикле newc[newi+X], но поскольку вы зацикливаетесь до конца, у вас не останется места и вы получите IndexOutOfBoundsException...

for (int i=0 ; i<c1.length ; i++) {
    for (int j=0 ; j<c2.length ; j++) {
        newc[newi]=c1[i];
        newc[newi+1] = '*';
        newc[newi+2] = c2[j];
        newc[newi+3] = '+';
        newi+=4;
    }
}

ОБНОВИТЬ:

Дополнительное объяснение:-)

Если вы делаете что-то вроде этого:

public class ArrayExample {
    public static void main(String[] args) {
        String[] strings = new String[3];
        System.out.println("strings.length = " + strings.length);
        strings[4] = "foo";
    }
}

Выход будет:

strings.length = 3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at nl.ivonet.ArrayExample.main(ArrayExample.java:26)

Это потому, что я пытался присвоить значение по индексу 4 массива строк, но массив строк был инициализирован с new String[3] присвоив ему фиксированный размер 3. Вот что пошло не так и почему ваш код провалился. Массив - это не то же самое, что список. И массив является фиксированным размером, а список нет.

Другие вопросы по тегам