Passar tipo de operação matemática como String

6 respostas
C

Boa tarde. Tem como eu fazer isto:

String operacao = "+"; int valor1 = 10; int valor2 = 2; int resultado = valor1 + operacao + valor2;
Ou seja, passar a operação a ser executada no momento da execução, dependendo do valor da String recebida?
Grato, Carlos.

6 Respostas

F

cmendes:
Boa tarde. Tem como eu fazer isto:

String operacao = "+"; int valor1 = 10; int valor2 = 2; int resultado = valor1 + operacao + valor2;
Ou seja, passar a operação a ser executada no momento da execução, dependendo do valor da String recebida?
Grato, Carlos.

Em java não há “eval”, isso que você quer fazer em linguagens dinâmicas como JavaScript, Ruby e Python seria muito fácil.

Bem, mas focando em Java, você terá que tratar essa operação com “ifs”, não tem muito jeito :frowning:

C

Ok, muito obrigado…

Alexandre_Saudate

Isso não quer dizer que você não pode ter um certo grau de dinamismo em Java. Obviamente, não é tão fácil quanto em linguagens dinamicamente tipadas, mas dê uma olhada em frameworks como Javassist, por exemplo. Talvez você consiga fazer algo do tipo.

[]´s

M

Tem jeito sim, e sem utilizar IFs!

Faça assim:

public interface Operacao{ public int efetua(int fatorA, int fatorB); } public class Soma implements Operacao{ public int efetua(int fatorA, int fatorB){ return fatorA + fatorB; } } import java.util.Map; import java.util.HashMap; public class Executavel{ static Map<String, Operacao> mapa = new HashMap<String, Operacao>(); static{ mapa.put("+", new Soma()); } public static void main(String[] args){ Operacao op = mapa.get("+"); //Passe a String com a operação System.out.println(op.efetua(10, 2)); } }
Se quiser implementar outras operações (subtração, etc) basta seguir o modelo da Soma: criar uma classe que implemente a interface Operacao e implemente o método efetua da forma que quiser.

Abraços,
Marcone - http://marconems.blogspot.com

marcelogn

Creio q só com if:

if(operacao.equals("+"))
result = n1 + n2;

else if(operacao.equals("-"))
result = n1 - n2;

etc...

davidbuzatto

Para coisas simples como operações, dá p/ vc usar um ScriptEngine. Olhe um exemplo com a engine para javascript (na verdade, vai ser instanciada uma engine para ECMAScript).

import javax.script.*;

.
.
.

ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName( "javascript" );

// com isso vc vê realmente o nome da linguagem que é suportada pela engine
// no caso vai ser ECMAScript
System.out.println( se.getFactory().getLanguageName() );

String n1 = "12";
String n2 = "23";
String op = "+";

try {

    String r = String.valueOf( se.eval( n1 + op + n2 ) );
    double d = Double.parseDouble( r );
    System.out.println( d );

} catch ( ScriptException exc ) {
    exc.printStackTrace();
}

[]´s

Criado 1 de junho de 2010
Ultima resposta 1 de jun. de 2010
Respostas 6
Participantes 6