Хранение формулы в базе данных и необходимость замены значений во время выполнения - PullRequest
0 голосов
/ 19 января 2012

Есть объект, который является промышленной частью, которую я храню в базе данных.Основываясь на пользовательском вводе, нам нужно рассчитать номер каждой необходимой промышленной детали.Мы рассчитываем это число на основе формулы, которую мы храним в дБ для каждой промышленной детали.

part1 -> формула = (input1 + input2) / (input3) part2 -> формула = (input1 * input2 * input3)

Поэтому, когда пользователь вводит input1 = 4 input2 = 6 input3 = 2, мне нужно вызвать функцию вычисления количества деталей.нет из part1s - (4 + 6) / 2 = 5 мес из part2s - (4 * 6 * 2) = 48

Я мог бы сделать это с помощью String, но это становится очень сложным, потому что у меня больше 7пользовательские вводы и формулы также очень сложны.

Есть ли лучший способ сделать это.

Update1 Я пытался сделать это с помощью регулярных выражений Java

                    String[] validInputs = {"halfs", "fulls", "noOfPartitions"};
    List<String> validInputsList = Arrays.asList(validInputs);
    HashMap inputMap = new HashMap();
    inputMap.put("halfs", 3);
    inputMap.put("fulls", 3);
    inputMap.put("noOfPartitions", 2);
    String formula = "(halfs+fulls)/noOfPartitions";
    Iterator iter = inputMap.keySet().iterator();
    while(iter.hasNext()) {

          String key = (String)iter.next();
          Pattern p = Pattern.compile(key);
            // get a matcher object
            Matcher m = p.matcher(formula);
            formula = m.replaceAll(inputMap.get(key).toString());

    }
    System.out.println(formula);

Update2 Мне действительно нужно это для приложения Grails.Вот что я в итоге сделал.

        def inputMap = ['halfs':3, 'fulls':3,'noOfPartitions':2]
def formula = '(halfs+fulls)/noOfPartitions'
inputMap.each { entry -> 

    def pat = ~entry.key
    assert pat instanceof java.util.regex.Pattern
    def matcher = (formula =~ /$pat/)
    formula = matcher.replaceAll((inputMap.get(entry.key)).toString())
    assert matcher instanceof java.util.regex.Matcher

}
System.out.println(formula)
Eval.me(formula)  

1 Ответ

0 голосов
/ 19 января 2012
  1. Напишите свои формулы в виде заводного скрипта.
  2. Сохраните скрипт в БД.
  3. Java 6 имеет хорошую поддержку динамических языков.Вот учебник , с которого можно начать .

Вот учебник деталей. Руководство по программированию Java Scripting

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