Математическое выражение (строка) для числа в Java

Я пытаюсь найти что-то вроде Java Embedded Plugin (JEP), который может оценить математическую формулу (строку) и дать ответ.

Но он также должен вычислять переменную, например: (25+36+x)*2 = 25 должно дать: x = -11

Немного похоже на http://www.wolframalpha.com/, но оно не должно быть таким универсальным и работать автономно.

Открытый источник является предпочтительным.

Мне это нужно для моего маленького проекта калькулятора, http://sourceforge.net/projects/calex/.

2 ответа

Это называется Arithmetic evaluation, Один из самых простых способов реализовать это - использовать Edsger Dijkstra http://en.wikipedia.org/wiki/Shunting-yard_algorithm.

Алгоритм маневрового двора - это метод анализа математических уравнений, указанных в инфиксной записи. Его можно использовать для вывода в обратной польской нотации (RPN) или в виде абстрактного синтаксического дерева (AST). Алгоритм был изобретен Эдсгером Дейкстрой и назван алгоритмом "маневрового двора", потому что его работа напоминает работу маневрового участка железной дороги. Как и при оценке RPN, алгоритм шунтирующего двора основан на стеке. Инфиксные выражения - это форма математической нотации, к которой привыкло большинство людей, например 3+4 или 3+4*(2−1). Для преобразования есть две текстовые переменные (строки), вход и выход. Существует также стек, в котором хранятся операторы, еще не добавленные в очередь вывода. Для преобразования программа считывает каждый символ по порядку и делает что-то на основе этого символа.

Но я видел точное решение того, что вы ищете в каком-то блоге пользователя stackru, но я не могу вспомнить адрес (это было похоже на "код обезьянства"). Это был легкий класс, который вы могли использовать в апплетах (вы также могли определять константы и значения сброса).

Изменить: Найдено: http://tech.dolhub.com/Code/MathEval

Линейно-рекурсивный математический оценщик

Этот оценщик математических выражений был рожден из-за необходимости иметь компактное и эффективное решение, которое могло бы достаточно эффективно оценивать произвольные выражения, не требуя предварительной компиляции. Мне нужно было что-то, что делало бы основную математику с переменными, такими выражениями, как "Top+2", "Bottom-2" и "(Right+1-Left)/2".

Исследования в Интернете выявили ряд довольно хороших решений, все из которых вращались вокруг создания деревьев разбора (что имеет смысл). Проблема была в том, что все они были довольно громоздкими, и я не мог позволить себе добавить 100К к размеру моего апплета только для математики. Поэтому я начал задумываться о линейном рекурсивном решении проблемы. Конечным результатом является приемлемо работающий отдельный класс без внешних зависимостей весом менее 10 КиБ.

Я выпустил средство оценки выражений, основанное на алгоритме Shijnting Yard Дейкстры, в соответствии с условиями лицензии Apache License 2.0:

http://projects.congrace.de/exp4j/index.html

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