dimanche 22 février 2015

Calculator in one string with priority

How can I create a better solution without stacks or otherwise optimize this code.



import java.util.*;

public class Calc
{

// (15+25)+((15+25)+5)


public static String calc(String a, String b, String operator){


switch (operator) {

case "+": return Double.valueOf(a) + Double.valueOf(b)+"";

case "~": return Double.valueOf(a) - Double.valueOf(b)+"";

case "*": return Double.valueOf(a) * Double.valueOf(b)+"";

case "/": return Double.valueOf(a) / Double.valueOf(b)+"";

}

return null;

}


//difference with operator '-'..i replace this operator to ~

public static String minustotild(String s){

String result = ""+s.charAt(0);

for (int i = 1; i < s.length(); i++){

if ((s.charAt(i) == '-') && ("+-*(/~".indexOf(s.charAt(i-1)) == -1)) // if previous char is not a symbol( is digit)

result += ""+'~';

else result +=""+s.charAt(i);

}

return result;

}

public static String operate(String expression){


String num[]; int index = -1;
Character priorityOperator='/'; // default
String operators;
while (!(( operators = expression.replaceAll("[^*+/~]","") ).isEmpty())) // while have operator..
{

if ( (index = operators.indexOf('/')) == -1){ // choose priority operator
priorityOperator = '*';
if ( (index = operators.indexOf('*')) == -1){
priorityOperator=operators.charAt(0);
index = operators.indexOf(priorityOperator);
}
}
num = expression.split("[^0-9\\-.]"); // сплитим все числа..

// заменяем строкое представление арифметики,на строковой результат с помощью калк().
expression=expression.replaceFirst(num[index]+"\\"+priorityOperator+num[index+1], calc(num[index],num[index+1],""+priorityOperator));

}

return expression;

}


public static String operateBracket(StringBuilder s, int startIndex){
// ''
// 3+4+(4+(3+3)+5)+(4+)
if (startIndex == -1) { // если скобок нету то оперируем .
return (operate(s.toString()));
}
else {
int k = 1;
for (int i=startIndex+1; i < s.length(); i++){

if (s.charAt(i) == '(')
k++;
else if ((s.charAt(i) == ')'))
{
if (k == 1) { // нашли конец первой скобки. не знаю как лучше сделать)

String newBracket = s.substring(startIndex+1, i);

s=s.replace(startIndex,i+1,operateBracket(new StringBuilder(newBracket), newBracket.indexOf(""+'(')));

}
k--;
}

}
}

return operate(s.toString());

}





public static void main(String[] args){

Scanner s = new Scanner( System.in );
String b = s.next();

do {

StringBuilder a = new StringBuilder(minustotild(b));
System.out.println(" result = "+operateBracket(a,a.indexOf(""+'(')));

} while ( (b = s.next()) != "null");


}

}

Aucun commentaire:

Enregistrer un commentaire