2010-06-04 34 views
6

que estoy tratando de evaluar lo siguiente de una cadenaevaluar los valores booleanos en Java

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

que necesito para obtener un valor booleano de true para éste.
¿Alguna idea sobre cómo resolver este problema de la manera más eficiente?

+3

mira la pregunta: http://stackoverflow.com/questions/2605032/using-eval-in-java – Thierry

+0

thanx Thierry, echaremos un vistazo ahora. – Adnan

+0

@ Thierry Creo que esta no es la forma más eficiente de cargar todo el intepreter. – ant

Respuesta

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

gracias @aioobe, esto es bueno ya que no se necesita lib de terceros. – Adnan

+2

puede optimizar el bucle externo separándolo (usando un tiempo en lugar de un para, o usando un descanso al final del para) tan pronto como el resultado sea verdadero: no hay manera de que pueda volverse falso otra vez – Thierry

+0

@ Thierry, claro. Hacer una división usando una expresión regular tampoco es la solución más eficiente: P – aioobe

0

Necesitará una pequeña gramática de expresiones booleanas. Un poco de análisis recursivo debería hacer el truco.

Si no sabe cómo escribir un analizador de este tipo, puede usar JavaCC o algo similar.

0

hay generadores de parásitos disponibles para los que puede definir una gramática.

Pero si solo tienes || y & & como operadores y verdadero y falso como los valores que se puede hacer esto por sí mismo, por implmenting una manera muy sencilla máquina de estados finitos:

1.) Dividir la cadena en las fichas

2.) analizar el la izquierda más valor utilizando Boolean.parseBoolean (token) y es valor seguro en alguna variable de instancia (su estado)

3.) combinar la variable de instancia con el siguiente token booleana utilizando el operador dado

4.) Repite el paso 3 hasta que termines toda la cadena

Esto parece funcionar, aunque no he probado :) 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)); 
    } 
} 

eso deben darle un valor cirrectly analizado, pero se pone un poco más compleja si se permite que entre paréntesis, por ejemplo;)

divertirse y compruebe aquí la teoría Finite-state_machine

1

Si los únicos operadores son && y ||, entonces yo creo que esto funcionará:

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

Para expresiones más complicadas, encontré this library sólo por eso. Sin embargo, no sé cuán eficiente es.

Cuestiones relacionadas