2016-06-21 5 views
0

Ich habe unten platziert mein Problem ist so einfach wie möglich. Angesichts einer Zeichenfolge, die einen mathematischen Literalausdruck enthält, möchte ich den gleichen Ausdruck erhalten, indem ich Buchstaben in Zahlen umwandle, die Werte aus einer Karte annehmen. Ich habe unter meinem Code für jede Hilfe von euch geschrieben.Konvertieren von literalen Ausdruck in numerischen Werten aus einer Karte

public class Prova { 
    public static void main(String[] argv) { 
     //mathematical expression 
     String expr = "(a*b)+(b/a)"; //(15*60)+(60/15) 
     //Map of numeric values 
     HashMap<String, Double> itemval = new HashMap(); 

     itemval.put("a", 15.0); 
     itemval.put("b", 60.0); 

     System.out.println("itemval: " + itemval); 
     System.out.println("expr: " + expr); 

     //convert literal expression numerically 
     char[] nc = expr.toCharArray(); 
     for (int t = 0; t < nc.length; t++) { 
      char pippo = nc[t]; 
      for (String key : itemval.keySet()) { 
       if (key.equals(pippo)) { 
        System.out.println("pippo: " + itemval.get(key)); 
       } 
      } 
      System.out.print(nc[t]); 
     } 
    } 
} 

, was ich will, ist eine Ausgabe wie (15 * 60) zu bekommen + (60/15) Vielen Dank im Voraus ...

+0

Wenn Sie sicher sind, dass „a“ wird immer einzelne Zeichen und wird nicht an anderen Orten (also keine Sache wie (a * bab)) erscheinen, verwenden Sie einfach String.replaceAll() – Nadir

+0

Dies könnte Ihnen helfen: 'http: // stackoverflow.com/questions/7258538/free-java-library-for-evaluating-math-expressions' – Kartic

Antwort

0

Sie könnte anstelle von char-Arrays mit String arbeiten die tun Ersatz.

/* expr.split("") create an arrays of string. 
* Each String element is a character of the original string.  
*/ 
for (String s : expr.split("")) { 
    if (itemval.containsKey(s)) { 
     expr = expr.replaceAll(s, itemval.get(s).toString()); 
    } 
} 
System.out.println(expr); 

Ausgang: (15,0 * 60,0) + (60,0/15,0)


Wenn Sie die Zahl formatiert werden soll die .0 nicht zeigen zu tun, können Sie eine Number verwenden können:

NumberFormat nf = NumberFormat.getNumberInstance(); 
for (String s : expr.split("")) { 
    if (itemval.containsKey(s)) { 
     expr = expr.replaceAll(s, nf.format(itemval.get(s))); 
    } 
} 

Output: (15 * 60) + (60/15)

0
import java.util.HashMap; 
import java.util.Map; 

public class Prova { 
    public static void main(String[] argv) { 
     // mathematical expression 
     String expr = "(a*b)+(b/a)"; // (15*60)+(60/15) 
     // Map of numeric values 
     HashMap<String, Double> itemval = new HashMap(); 

     itemval.put("a", 15.0); 
     itemval.put("b", 60.0); 

     System.out.println("itemval: " + itemval); 
     System.out.println("expr: " + expr); 

     for (Map.Entry<String, Double> e : itemval.entrySet()) { 
      expr = expr.replaceAll(e.getKey(), String.valueOf(e.getValue())); 
     } 

     System.out.println(expr); 
    } 
} 

Ausgang:

itemval: {b=60.0, a=15.0} 
expr: (a*b)+(b/a) 
(15.0*60.0)+(60.0/15.0)