2010-06-04 20 views
6

sto cercando di valutare il seguito da una stringavalutare valori booleani in Java

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

ho bisogno di ottenere un valore booleano di true per questo.
Qualche idea su come risolvere questo problema nel modo più efficiente?

+3

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

+0

thanx Thierry, darà un'occhiata ora. – Adnan

+0

@Thierry Penso che questo non sia il modo più efficace per caricare interi interpreti – ant

risposta

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

grazie @aioobe, questo è buono in quanto non è necessario alcun lib di terze parti. – Adnan

+2

potresti ottimizzare il ciclo esterno suddividendolo (usando un po 'di tempo anziché un for, o usando un'interruzione alla fine del for) non appena il risultato è vero: non c'è modo che possa diventare falso di nuovo – Thierry

+0

@ Thierry, certo. Fare una divisione utilizzando un'espressione regolare non è la soluzione più efficiente: P – aioobe

0

Avrai bisogno di una piccola grammatica di espressioni booleane. Un po 'di analisi ricorsiva dovrebbe fare il trucco.

Se non si sa come scrivere un tale parser, è possibile utilizzare JavaCC o qualcosa di simile.

0

sono disponibili parsergenerator per cui è possibile definire una grammatica.

Ma se hai solo || e & & come operatori e vero e il falso come valori si può facilmente fare questo da soli, per implmenting una semplice macchina a stati finiti:

1.) Dividere la stringa in gettoni

2.) di analizzare la più a sinistra valore utilizzando Boolean.parseBoolean (token) e sicuro il suo valore in qualche variabile di istanza (il tuo stato)

3.) combinare la variabile di istanza con il token successivo booleano utilizzando il determinato operatore

4.) Ripeti il ​​passaggio 3 fino a completare l'intera stringa

Questo sembra funzionare anche se i havent thorougly provato :)

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)); 
    } 
} 

i thats dovrebbe dare un valore cirrectly analizzato, ma si otterrà un po 'più complessa se si consente staffe per esempio;)

divertirsi e controllare qui per la teoria Finite-state_machine

1

Se gli unici operatori sono && e ||, allora penso che questo funzionerà:

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

Per le espressioni più complicate, ho trovato this library solo per questo. Non so quanto sia efficiente.

Problemi correlati