2016-09-26 3 views
-1

Ich versuche, einen Ausdruck als String in eine Ganzzahl zu konvertieren. Für Beispiel Wenn "1 + 5 * 5" angegeben wird, sollte die Methode "26" zurückgeben. Ich begann nur das Schreiben von Code für eine Multiplikation zu lösen, aber wenn ich es dort laufen ist keine AusgabeString zu Integer Expressions

public static void operationS(ArrayList<String> m) 
{ 
    for (int i=0; i<m.size(); i++) 
    { 
     while ((m.get(i)).contains("*")) 
     { 
      int x = ((m.get(i)).indexOf("*")); 
      char A=((m.get(i)).charAt(x-1)); 
      char B= ((m.get(i)).charAt(x+1)); 

      int r= Character.getNumericValue(A)*Character.getNumericValue(B); 

      String numberAsString = Integer.toString(r); 

      if(x==1 && (m.get(i)).length()==3) 
      { 
       m.set(i, numberAsString); 

      } 

      if(x==1 && (m.get(i)).length()>3) 
      { 
      String n = numberAsString+((m.get(i)).substring(x+2)); 
      m.set(i, n); 

      } 

      else 
      { 
       String k= ((m.get(i)).substring(0,x-1))+numberAsString+((m.get(i)).substring(x+2)); 
      } 

      } 
     } 
    for (int u=0;u<m.size();u++) 
      { 
      System.out.println (m.get(u)); 
      } 
    } 

Da ich keine Bibliotheken importieren, mein Aktionsplan des String war ersetzt jedes Mal eine Operation abgeschlossen wurde .

Ich plane, die gleiche Schleife zur Verwendung für Addieren, Subtrahieren und Dividieren

+0

Ich bin mir ziemlich sicher, dass Sie eine exakte Kopie heute früher geschrieben ... Bitte nicht exakt die gleichen Fragen Sie umbuchen, ist es entmutigt und sehr verpönt. – Li357

+0

Wie läuft es? – immibis

+0

Bitte forschen Sie etwas über das Parsing von Ausdrücken. Im Grunde müssen Sie die Zeichenfolge von links nach rechts durchgehen, nach _lexemes_ suchen, die die Zahlen und Operatoren im Ausdruck darstellen, und mit ihnen arbeiten, wenn sie auftauchen. Wenn Sie nach Operatoren suchen und versuchen, die Zahlen neben ihnen zu finden, wird das höchstwahrscheinlich zu Trauer führen, wenn Sie Operationen in der falschen Reihenfolge ausführen. – ajb

Antwort

0

Erwägen Sie Ihre Ausdrucksanalyse. Sie können wahrscheinlich eine Präfix-, Infix- oder Postfix-Notation und Parsing verwenden, um den Eingabeausdruck zu bewerten.

Ich stieß auf einen Artikel, den Sie in Verständnis helfen kann, wie dies zu erreichen:

http://www.sunshine2k.de/coding/java/SimpleParser/SimpleParser.html

Der Artikel im Grunde spricht über verschiedene Ansätze, dieses Problem zu lösen.

Ich persönlich mochte den rekursiven Ansatz. Wenn Sie Rekursion verstehen, können Sie das wählen.

Wenn Sie jedoch nur eine Schleife verwenden möchten, bevorzugen Sie möglicherweise einen der anderen Ansätze.

aktualisieren: eine Probe Stück Code Hinzufügen Rekursion Implementierung basiert auf dem Artikel oben verbunden.

static final char[] ops = { '-', '+', '*', '/'}; 

    static double evaluate(String s){ 
     for(char op: ops) { 
      if(s.contains(String.valueOf(op))){ 
       String op1 = s.substring(0, s.indexOf(op)); 
       String op2 = s.substring(s.indexOf(op) + 1, s.length()); 
       switch(op) { 
        case '-': return evaluate(op1) - evaluate(op2); 
        case '+': return evaluate(op1) + evaluate(op2); 
        case '*': return evaluate(op1) * evaluate(op2); 
        case '/': return evaluate(op1)/evaluate(op2); 
       } 
      } 
     } 
     /* at this point there is no operator in the term anymore, just a number */ 
     return (convertToDouble(s)); 
    } 

    private static double convertToDouble(String s) { 
     return Double.parseDouble(s); 
    } 
0

bereits.

static String replaceAll(CharSequence cseq, String regex, Function<MatchResult, String> replacement) { 
    Matcher matcher = Pattern.compile(regex).matcher(cseq); 
    StringBuffer sb = new StringBuffer(); 
    while (matcher.find()) { 
     String replaced = replacement.apply(matcher.toMatchResult()); 
     matcher.appendReplacement(sb, Matcher.quoteReplacement(replaced)); 
    } 
    matcher.appendTail(sb); 
    return sb.toString(); 
} 

static int toInt(String s) { 
    return Integer.parseInt(s); 
} 

Und

String input = "1 + 5 * 5"; 
String output = input; 
while (true) { 
    String r = replaceAll(output, "(\\d+)\\s*\\*\\s*(\\d+)", 
     m -> "" + (toInt(m.group(1)) * toInt(m.group(2)))); 
    if (r.equals(output)) break; 
    output = r; 
} 
while (true) { 
    String r = replaceAll(output, "(\\d+)\\s*\\+\\s*(\\d+)", 
     m -> "" + (toInt(m.group(1)) + toInt(m.group(2)))); 
    if (r.equals(output)) break; 
    output = r; 
} 
System.out.println(input + " -> " + output); 

Ergebnis:

1 + 5 * 5 -> 26