Помогите с обновлением условия цикла - PullRequest
0 голосов
/ 03 апреля 2011

Хорошо. Поэтому я пытаюсь написать приложение, которое решает проблемы в правильном порядке операций (т. Е. PEMDAS, но без PE lol). Я, вероятно, делаю это неправильно, но что угодно. Что мне нужно, так это то, что в качестве итерации по каждому элементу в массиве, если это оператор, я удаляю два элемента (числа, окружающие оператор, потому что я заменяю оператор на правильное вычисление, поэтому массив с тремя элементами, 5 +5, станет массивом с одним элементом, 10), что было бы хорошо, но условие for-Statement не обновляется, поэтому, другими словами, когда я обновляю массив, array.length становится короче, но for-Statement не распознает это и продолжает проходить через границы массива, это вызывает ошибки outbbounds. Лучший способ объяснить это с помощью моего кода, так что вот оно:

for (i = 0; i < splitEquation.length; i++){
        if (splitEquation[i].equals("*")){
            splitEquation[i] = Double.toString(Double.parseDouble(splitEquation[i - 1]) * Double.parseDouble(splitEquation[i + 1]));
            splitEquation = removeIndex(splitEquation, i - 1);
            splitEquation = removeIndex(splitEquation, i + 1);
            solution += Double.parseDouble(splitEquation[i - 1]);

        }
}

И удалить индекс ():

private String[] removeIndex(String [] s, int index){
    String [] n = new String[s.length - 1];

    System.arraycopy(s, 0, n, 0, index - 1);
    System.arraycopy(s, index, n, index - 1, s.length - index);
    return n;
}

Заранее спасибо, -Эрик

P.S. Дайте мне знать, если вам нужно уточнить, что делает мой код:)

Ответы [ 3 ]

0 голосов
/ 03 апреля 2011

Зачем изменять входной массив, если вы можете использовать входной массив только для чтения и создавать выходные ArrayLists (или лучше стеки)?

0 голосов
/ 03 апреля 2011

Я думаю, что если вы используете динамическую структуру, такую ​​как ArrayList , вы сможете исправить эту проблему.

Согласно этому:

Емкость - это размер массива, используемого для хранения элементов в списке.Это всегда как минимум размер списка.Когда элементы добавляются в ArrayList, его емкость автоматически увеличивается.

и в этом предыдущем посте SO, использование динамической структуры данных должно решить вашу проблему, я думаю, что тот же механизмприменяется для удаления, а также добавления элементов из списка.Тем не менее, вам может потребоваться реализовать какой-либо механизм для отслеживания местоположения элементов после каждой замены, которую вы делаете.

0 голосов
/ 03 апреля 2011

Использование ArrayList Сделало бы вашу жизнь намного проще:

ArrayList<String> splitEquation = 
    new ArrayList<String>(Arrays.toList("5","*","5"));

for (i = 0; i < splitEquation.size(); i++){
    if (splitEquation.get(i).equals("*")) {
        splitEquation.set(i, 
            (Double.toString(Double.parseDouble(splitEquation.get(i - 1)) * 
                Double.parseDouble(splitEquation.get(i + 1))));
        splitEquation.remove(i - 1); // shortens array by 1
        splitEquation.remove(i); // this used to be (i + 1)
        i--; // move back one (your computed value)
        solution += Double.parseDouble(splitEquation.get(i));

    }
}

При этом ... вам действительно нужно изменить свой массив на месте?

РЕДАКТИРОВАТЬ: Вопрос теперь более ясен, массив был изменен, потому что его нужно оценивать как последовательность выражений.Он также хочет добавить сложение и вычитание:

Рекурсивные функции - ваш друг:)

public static double result(ArrayList<String> mySequence, double total, int index)
{
    if (index == 0)
        total = Double.parseDouble(mySequence.get(index));

    if (index == (mySequence.size() - 1))
        return total;
    else if (mySequence.get(index).equals("*"))
        total *= Double.parseDouble(mySequence.get(index + 1));
    else if (mySequence.get(index).equals("/"))
        total /= Double.parseDouble(mySequence.get(index + 1));
    else if (mySequence.get(index).equals("+"))
    {
        index++;
        double start = Double.parseDouble(mySequence.get(index));
        total += result(mySequence, start, index);
        return total;
    }
    else if (mySequence.get(index).equals("-"))
    {
        index++;
        double start = Double.parseDouble(mySequence.get(index));
        total -= result(mySequence, start, index);
        return total;
    }

    index++;
    return result(mySequence, total, index);

}

public static void main(String args[])
{
    ArrayList<String> splitEquation = 
        new ArrayList<String>(
            Arrays.asList("5","*","5","/","5","*","4","-","3","*","8"));

    double myResult = result(splitEquation, 0, 0); 
    System.out.println("Answer is: " + myResult);
}

Выход:

Ответ: -4.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...