2012-04-18 2 views
5

Друзей,Java - Динамическое сравнение с примитивными типами данных

Обращается рамкой для проверки ...

У нас есть конфигурационный файл, как показано ниже ...

<root> 
<property name="Premium"> 
    <xmlTag>//Message/Request/Product/Benefit/Premium/amount</xmlTag> 
    <valueType>float</valueType> 
    <validation condition=">" value="0">Premium Amount cannot be less than Zero.</validation> 
</property> 

Я получаю XML-значение с помощью XPath и преобразовать его в плыву <valueType> значения элемента ...

Нет, у меня есть value="0" также были преобразованы в поплавок.

Теперь мне нужно применить условие, указанное как condition=">".

Я не хочу этого делать, ЕСЛИ ELSEIF .... ELSE.

Есть ли другой способ конвертировать «<» оператору < или использовать оператор сравнения на Строке?

Таким образом, мой код будет простым и полезным для будущих операторов.

================================================================================================================================= ===============================

Спасибо всем за предложения и ответы ...

I решили использовать команду bsh.Interpreter BeanShell. Это делает работу для меня ...

пример кода для всех вас ...

 System.out.println(new bsh.Interpreter().eval("1 < 0")); 
     System.out.println(new bsh.Interpreter().eval("1 > 0")); 
     System.out.println(new bsh.Interpreter().eval("1 >= 0")); 
     System.out.println(new bsh.Interpreter().eval("0 >= 0")); 
     System.out.println(new bsh.Interpreter().eval("1 != 0")); 
     System.out.println(new bsh.Interpreter().eval("0 != 0")); 
     System.out.println(new bsh.Interpreter().eval("1 == 0")); 
     System.out.println(new bsh.Interpreter().eval("0 == 0")); 

вернула меня истина/ложь.

Спасибо & Успехов ...

+0

Вам не нужно использовать цепочку 'if-then-else', вы можете использовать хэш-карту. Но нет ярлыков, чтобы делать это динамически, так что вам нужно много кодирования. – dasblinkenlight

+0

Вам нужно «<=»? (Или любые другие операторы с более чем одним символом) –

+1

Посмотрите также на этот вопрос: http://stackoverflow.com/questions/1432245/java-parse-a-mathematics-expression-given-as-a -string-and-return-a-number, а также этот: http://stackoverflow.com/questions/3832323/java-string-and-mathematics-expression-evaluators –

ответ

2

Вы можете использовать переключатель заявление

char operator = ...; 
switch(operator) { 
    case '<': return value1 < value2; 
    case '=': return value1 == value2; 
} 
+0

Вы ввели задание в последнем 'случае' по ошибке; вместо этого используйте '=='. –

+0

@CostiCiudatu Да, спасибо. –

0

Оберните примитивное значение в соответствующую обертку:

Float f = new Float(floatValue) 

Затем вы можете использовать предоставленный compareTo() метод полиморфно.

EDIT: Вы также можете взглянуть на полнофункциональные реализации для синтаксического анализа выражений; кроме других, которые уже упоминались здесь, я бы добавил Spring EL.

+0

Как это дает OP возможность использовать String «<» в качестве метода сравнения? –

+0

'' 'test должен перевести на' a.compareTo (b) <0'. Строка 'compareTo' выполнит лексикографический тест, а числовые обертки будут делать то, что вы ожидаете; однако вы можете рассматривать их как «сравнимые» экземпляры. –

+0

Заметим также, что все операторы <, <=, >,> =, ==,! = Могут быть представлены таблицей результатов для 'compareTo()' <0, == 0 или> = (так, например, <= будет просто определяться как «истина, истина, ложь» и! = как «истина, ложь, истина») –

2

Я бы рекомендовал использовать язык выражений, таких как Java EL или даже лучше Apache Commons Jexl, так как это намного проще интегрировать.Вот пример кода, взятый из JEXL website:

// Assuming we have a JexlEngine instance initialized in our class named 'jexl': 
    // Create an expression object for our calculation 
    String calculateTax = "((G1 + G2 + G3) * 0.1) + G4"; 
    Expression e = jexl.createExpression(calculateTax); 

    // populate the context 
    JexlContext context = new MapContext(); 
    context.set("G1", businessObject.getTotalSales()); 
    context.set("G2", taxManager.getTaxCredit(businessObject.getYear())); 
    context.set("G3", businessObject.getIntercompanyPayments()); 
    context.set("G4", -taxManager.getAllowances()); 
    // ... 

    // work it out 
    Float result = (Float)e.evaluate(context); 

В вашем конкретном примере вы могли бы изменить проверки XML на что-то вроде:

<property name="Premium"> 
    <xmlTag>//Message/Request/Product/Benefit/Premium/amount</xmlTag> 
    <valueType>float</valueType> 
    <validation expression="Premium> 0">Premium Amount cannot be less than Zero.</validation> 
</property> 

, а затем создать свой собственный JEXL контекст:

JexlContext context = new MapContext(); 
context.set("PREMIUM", <Premium value fetched from XML>); 

По-моему, это наиболее масштабируемое решение, поскольку оно позволяет создавать сложные выражения проверки только в одной строке кода.