Как бы я оценил определенную формулу? - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть многомерный arrayList, и я спрашиваю у пользователя формулу, а затем оцениваю ее. Проблема в том, что я получаю пользовательский ввод, как это:

  ((a1+a2)/12)*a3

проблема в том, что a1 и a2 и a3 относятся к столбцам, и мне приходится оценивать их по определенному значению, и я полностью теряюсь в том, как подойти к этой проблеме, любые советы или рекомендации были бы полезны. Также это расчетное значение должно обновляться каждый раз, когда значение в любом из столбцов Обновить. Дело в том, что формула не жестко закодирована.

Ответы [ 4 ]

3 голосов
/ 23 сентября 2011

Лично я бы очень старался избегать всего разбора и искать библиотеку EL, которая позволяла бы вам использовать свой собственный преобразователь переменных. Все, что вам нужно сделать, это подключить переменные к вашей модели поддержки. (В вашем случае разделение по границе слова / буквы и поиск содержимого ячейки.)

Это также позволит вам включать произвольные функции, просто выставляя их на EL движок. Что-то вроде OGNL, MVEL и т. Д. Может быть хорошей отправной точкой. Кажется, намного проще.

3 голосов
/ 23 сентября 2011

Возможность написать что-то вроде парсера. Для представления выражения лучше использовать структуру двоичное дерево , а не список.

Каждый неконечный узел является операцией, а каждый лист - операндом.

tree

1 голос
/ 23 сентября 2011

Альтернативой предложению Гейзенбуга является попытка Дейкстры использовать алгоритм маневрового двора .Вместо того, чтобы полагаться на древовидную структуру, вы используете стеки и очереди.Преимущество состоит в том, что эти структуры данных не очень сложны.Недостатком является то, что любые ошибки в реализации алгоритма могут быть легко пропущены, так как вам нужно полностью понимать операции, чтобы знать, правильна ли ваша реализация.

0 голосов
/ 23 сентября 2011

Вам нужно будет превратить формулу в нечто вроде Двоичного дерева выражений . Это должно быть не , что сложно.

Затем вам нужно будет пройти по этому дереву, чтобы оценить значение выражения в начале и каждый раз, когда значение в arrayList изменяется. Сначала сконцентрируйтесь на построении дерева и получении правильных значений при его оценке. Не забывайте отрицательные числа и переменные! Отслеживание изменений в arrayList должно быть тривиальным.

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