Boa tarde, pessoal.
Para vocês qual é a melhor maneira de transformar uma expressão que está em uma String em um resultado?
Ex.:
A String
String exp = "1+1*2-2"
ser transformada no resultado 1.
Alguém conhece um algoritmo eficiente para isso?
Boa tarde, pessoal.
Para vocês qual é a melhor maneira de transformar uma expressão que está em uma String em um resultado?
Ex.:
A String
String exp = "1+1*2-2"
ser transformada no resultado 1.
Alguém conhece um algoritmo eficiente para isso?
Você precisa plotar um gráfico com essa expressão, ou ela vai ser calculada apenas uma vez?
No segundo caso, você pode simplesmente usar o suporte a scripting do Java ( http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html ).
No primeiro caso, você precisa procurar mais um pouco.
Um exemplo do caso 2.
import javax.script.*;
public class EvalScript {
public static void main(String[] args) throws Exception {
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
// evaluate JavaScript code from String
Object obj = engine.eval("1+1*2-2");
System.out.println (obj); // imprime "1.0"
System.out.println (obj.getClass()); // imprime "java.lang.Double"
}
}
Obrigado pelas dicas, entanglement.
Eu vou calcular apenas uma vez e será uma grande quantidade de expressões desse tipo. Não sei lhe dizer ao certo, mas acho que a biblioteca javax.script.* não está disponível onde irei executar o código. Outro problema seria a criação de vários objetos, pois o tempo para execução é curto. Precisaria mesmo era implementar algo manualmente. Se você tiver alguma ideia de um algoritmo ficaria agradecido.
Dá uma olhada:
a) javax.script vem no Java 6.0 (Sun) mas não no Java 5.0 ou anterior. (Não sei se o JavaScript vem no Java 6.0 da IBM ou da Apple, por sinal).
b) Se o lugar onde você for usar permitir Java 6.0, experimente usar javax.script primeiro, e veja se o tempo é razoável. Se for, nem precisa procurar algo muito mais eficiente que isso.
Dá uma olhada:
http://markytechs.wordpress.com/2009/06/22/resolver-expressoes-matematicas/
Vou olhar em casa com calma, mas pareceu bem interessante. Obrigado pela dica, ViniGodoy 
a) javax.script vem no Java 6.0 (Sun) mas não no Java 5.0 ou anterior. (Não sei se o JavaScript vem no Java 6.0 da IBM ou da Apple, por sinal).
b) Se o lugar onde você for usar permitir Java 6.0, experimente usar javax.script primeiro, e veja se o tempo é razoável. Se for, nem precisa procurar algo muito mais eficiente que isso.
Vou testar, mas acho que não passa. Todos os algoritmos que eu precisei usar algo da Collections API tive que fazer em C++ porque em Java estourava o tempo. O lugar em questão é o SPOJ BR. Mas vou tentar, numa dessas pode dar certo =)
Bem nesse meu código, eu fiz o seguinte:
Primeiro eu procuro encontrar a expressões que são calculada primeiro (%,/,*,+,-), e depois eu faço o
calculo pegando o número que vem depois da expressão e o que vem antes dela, e quando eu calculo eu
já de imediato diminuo o tamanho da String em -2, e faço isso até que o tamanho da String seja 1, que é
o resultado da Expressão.
Segue o jar
Boa tarde, pessoal.Para vocês qual é a melhor maneira de transformar uma expressão que está em uma String em um resultado?
Ex.:
A String
String exp = "1+1*2-2"ser transformada no resultado 1.
Alguém conhece um algoritmo eficiente para isso?
Se vc quiser dar uma olhada como vc pode resolver isso sem usar um framework dê uma olhada no codigo do middleheaven e adpate.
O uso pode ser visto na classe de teste ExpressionParserTest.
Dá uma olhada:
http://markytechs.wordpress.com/2009/06/22/resolver-expressoes-matematicas/
…
Eu ia dizer isso só com o nome do tópico.
Criei isso para casos simples como o seu e até com parenteses.
Bom, primeiramente, desculpe pela demora na resposta. Olhei todas as implementações e tirei algumas ideias.
Mas no fim acabei fazendo um algoritmo meio feio e com alguma perda de performance, mas que foi o suficiente para passar no tempo. Porém existe mais de um problema com esse tipo de enunciado, então o link de vocês será útil.
Obrigado pela ajuda de todos 
não tem como ser mais fácil e eficiente do que voce usar a ideia do Mark…
Só passando para agradecer a dica, em especial ao Marky. Foi muito útil aqui pra mim. Mais uma vez obrigado pro compartilharem seus conhecimentos =)
Abraço!
Sempre usei:
String str = String.valueOf(1*5+13-4);
…
Se der o problema de 13.9999999, por exemplo, use um DecimalFormat.
Daí fica:
String str = new DecimalFormat(“0.00”).format(3*123+4123);