2010-06-04 4 views
6

Я пытаюсь оценить следующие из строкиоценить логические значения в Java

boolean value = evaluate("false || true && true && false || true"); 

Мне нужно, чтобы получить логическое значение true для этого.
Любые идеи о том, как решить эту проблему наиболее эффективным способом?

+3

Посмотрите на вопрос: http://stackoverflow.com/questions/2605032/using-eval-in-java – Thierry

+0

thanx Thierry, посмотрим сейчас. – Adnan

+0

@Thierry Я думаю, что это не самый эффективный способ загрузки целого intepreter – ant

ответ

7
String value = ("false || true && true && false || true"); 
boolean result = false; 
for (String conj : value.split("\\|\\|")) { 
    boolean b = true; 
    for (String litteral : conj.split("&&")) 
     b &= Boolean.parseBoolean(litteral.trim()); 
    result |= b; 
} 
System.out.println(result); // prints true 
+1

спасибо @aioobe, это хорошо, так как нет необходимости в третьей стороне lib. – Adnan

+2

вы могли бы оптимизировать внешний цикл, вырвавшись из него (используя while вместо for for или используя разрыв в конце for), как только результат верен: он не может снова стать ложным – Thierry

+0

@ Тьерри, конечно. Выполнение разделения с использованием регулярного выражения не является наиболее эффективным решением: P – aioobe

0

Вам понадобится небольшая грамматика булевых выражений. Рекурсивный синтаксический анализ должен сделать трюк.

Если вы не знаете, как написать такой синтаксический анализатор, вы можете использовать JavaCC или что-то подобное.

0

есть парсергенераторы, для которых вы можете определить грамматику.

Но если у вас есть только || и & & как операторы и истинные и ложные ценности, как вы можете легко сделать это самостоятельно, по implmenting очень простой конечный автомат:

1.) Разделить строку на лексемы

2.) разбора оставил наибольшее значение с помощью Boolean.parseBoolean (маркер) и безопасной ее значения в некоторых переменном экземпляре (ваше состояние)

3.) объединить переменный экземпляр со следующей булевой лексемой с помощью данного оператора

4.) Повторите шаг3, пока не закончите всю строку

Это похоже на работу, хотя я нету thorougly тестировал :)

public class BooleanFSParser { 

    private boolean parse(String data) { 
     String[] tokens=data.split("\\s"); 
     boolean state=Boolean.parseBoolean(tokens[0]); 
     for (int i=1;i<(tokens.length/2) + 1;i=i+2){ 
      if (tokens[i].equals("&&")){ 
       state=state && Boolean.parseBoolean(tokens[i+1]); 
      }else{ 
       state=state || Boolean.parseBoolean(tokens[i+1]); 
      } 
     } 
     return state; 
    } 

    public static void main(String[] args) { 
     BooleanFSParser parser = new BooleanFSParser(); 
     boolean val = parser.parse("true && true || false"); 
     System.out.println(String.valueOf(val)); 
    } 
} 

Thats должен дать вам cirrectly разобранное значение, но это будет получить немного более сложным, если вы позволяете скобки, например;)

весело и проверить здесь для теории Finite-state_machine

1

Если только операторы && и ||, то я думаю, что это будет работать:

static boolean eval(String str) { 
    String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", ""); 
    return !s.contains("false") || s.contains("||true"); 
    } 

Для более сложных выражений, я нашел this library только для этого. Не знаю, насколько это эффективно.

Смежные вопросы