2013-02-26 14 views
7

Diciamo che ho un metodo che ha dichiarato in questo modo:Trasforma una stringa in un'espressione matematica?

public double Calc(String expression) { 

// Code 

} 

voglio prendere un'espressione String come

"2 + 4 - (3 * 4)" 

Poi alimentarlo per Calc() e dovrebbe restituire il valore che si ottiene.

Si può analizzare un'Espressione matematica da una stringa in modo che diventi un'espressione che Java può comprendere? Perché normalmente puoi semplicemente scrivere

return 2 + 4 - (3 * 4); 

Ma questo funzionerebbe solo per quella singola espressione.

+0

Date un'occhiata a questo: http://stackoverflow.com/questions/2605032/using-eval-in-java –

+1

Per rotolare il proprio normalmente usereste un albero di espressione http: //en.wikipedia .org/wiki/Binary_expression_tree –

+0

@beto Ma sembra che, facendo questo, si apra l'intero motore JS solo per fare questa cosa. Anche se mi ha dato un suggerimento, suppongo. Grazie! – OmniOwl

risposta

6

Io suggerirei di usare l'algoritmo twostack di Dijkstra.

Questo dovrebbe essere più o meno quello che ti serve:

public class DijkstraTwoStack { 
    public static void main(String[] args) { 
       Scanner scanner = new Scanner(System.in); 
       String exp[] = scanner.nextLine().split(" "); 
     Stack<String> ops = new Stack<String>(); 
     Stack<Double> vals = new Stack<Double>(); 

     for(int i = 0; i < exp.length; i++) { 
         String s = exp[i]; 
      if (s.equals("(")) { 
      } 
      else if (s.equals("+") || s.equals("*")) { 
       ops.push(s); 
      } else if (s.equals(")")) { 
       getComp(ops, vals); 
      } else { 
       vals.push(Double.parseDouble(s)); 
      } 
     } 
     getComp(ops, vals); 
     System.out.println(vals.pop()); 
    } 

    private static void getComp(Stack<String> ops, Stack<Double> vals) { 
     String op = ops.pop(); 
     if (op.equals("+")) { 
      vals.push(vals.pop() + vals.pop()); 
     } else if (op.equals("*")) { 
      vals.push(vals.pop() * vals.pop()); 
     } 
    } 
} 

non ho ancora testato, ma dovrebbe essere circa la destra.

+0

Non così efficiente, ma si può usare questo .... 'ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName ("js"); Oggetto risultato = engine.eval ("3 + 4"); ' * credits: http://stackoverflow.com/a/2605051/936786 –

+0

Si prega di non modificare il codice dalle risposte esistenti.Nessun iteratore era voluto, avrebbe rotto l'algoritmo. –

0

Lasciatemelo affermare è come una risposta un processo che potrebbe essere adottato come penso anche se sfogliando un paio di domande su SO si dovrebbe ottenere una buona idea su come farlo senza caricare un compilatore JS.

Per i principianti è necessario analizzare la stringa attraverso una funzione che converte la stringa matematica in una stringa infissa. Quindi questo fondamentalmente valuta questa espressione come un'altra funzione suddividendo la stringa in un ciclo per restituire la risposta. Un processo ben dettagliato può essere found here.

Problemi correlati