Executar conteúdo da String [RESOLVIDO]

21 respostas
R

Tenho uma String assim:

String x = "1 + 2";

Preciso “excutar o conteúdo” da String x e jogar seu resultado numa variável y.

Conheço Reflection e já usei várias vezes, mas não consigo encontrar uma forma de fazer isso com ele (que é o que todo mundo me fala: “Faz com Reflection”).

Por favor, alguém me socorre?!?!? :cry:

grata

21 Respostas

R

O caminho é um parser para a expressão…

Dá uma olhada nisso aqui…
http://www.singularsys.com/jep/

Não sei se é bom, mas foi o primeiro que o google trouxe procurando por “java math parser”

T

Isso não pode ser feito com reflection ( assim como água de melissa não cura todos os males, por mais que o fanático dos florais de Bach tente lhe convencer do contrário ) .
Em vez disso, use alguma biblioteca que permita avaliação de expressões.

Normalmente eu recomendaria o pacote beanshell , que permite montar um “interpretador Java”. http://www.beanshell.org/
Se puder usar o Java 6.0, veja o pacote javax.script - usando esse pacote você pode chamar o JavaScript para calcular suas expressões.

P

oi, tenta assim:

String y = x.subString(0,1);   // aqui vai o endereço da "1" na string
                                           //atribui o "1" em uma string

String z = x.subString(3,4);  // aqui vai o endereço do "2" na string
                                          //atribui o valor "2" em uma string
 
int a = Integer.parseInt(y);  //converte a string para int
int b = Integer.parseInt(z); //converte a string para int

int c = a +b;                      // faz a operação!!! ^^ boa sorte!!!

Gambiarra??? SIM!!!
FUNCIONA?? SIM!!!

êêêêê… \o/

P

Isso me lembra php… “10 galinhas” + “5 ovos” = 15 hehehehehehe

procura o código de uma calculadora cientifica no google / google codesearch … e veja como ela funciona…

abraço

P

acho que o importante é atingir o objetivo…
pois então qualquer forma de se obter a soma do que for da string ja ta valendo…

programação orientada a gambiarras (POG) nunca é a melhor solução!
abraços pessu!!!

R

Se um baca resolve seu problema, lá vai:

public static void main(String[] args) {
		try {

			char[] operadores = { '+', '-', '/', '*' };
			char operadorSelecionado = 0;

			String x = "1 + 2";
			String y = "";

			//Qual a operação ?
			for (int i = 0; i < operadores.length; i++) {
				if (x.indexOf(operadores[i]) != -1) {
					operadorSelecionado = operadores[i];
					break;
				}
			}

			String parte1 = x.substring(0, x.indexOf(operadorSelecionado));
			String parte2 = x.substring(x.indexOf(operadorSelecionado) + 1);

			switch (operadorSelecionado) {
				case '+' :
					y =
						String.valueOf(
							Double.parseDouble(parte1)
								+ Double.parseDouble(parte2));
					break;
				case '-' :
					y =
						String.valueOf(
							Double.parseDouble(parte1)
								- Double.parseDouble(parte2));
					break;
				case '/' :
					y =
						String.valueOf(
							Double.parseDouble(parte1)
								/ Double.parseDouble(parte2));
					break;
				case '*' :
					y =
						String.valueOf(
							Double.parseDouble(parte1)
								* Double.parseDouble(parte2));
					break;
				default :
					System.out.println("Operador desconhecido");
					break;
			}
			System.out.println("y = " + y);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

:smiley:

R

Então gente, na base da POG eu tb saberia resolver… mas não era um programa cheio de loops com cases e substrings que eu queria.

Qto a expressao, eu usei “1 + 2” como exemplo, mas QUALQUER expressão matemática está envolvida nisso, fazer parser não resolve.

Eu literalmente preciso “executar uma string” :cry:

R

:shock:

pmsoad:
oi, tenta assim:

String y = x.subString(0,1);   // aqui vai o endereço da "1" na string
                                           //atribui o "1" em uma string

String z = x.subString(3,4);  // aqui vai o endereço do "2" na string
                                          //atribui o valor "2" em uma string
 
int a = Integer.parseInt(y);  //converte a string para int
int b = Integer.parseInt(z); //converte a string para int

int c = a +b;                      // faz a operação!!! ^^ boa sorte!!!

Gambiarra??? SIM!!!
FUNCIONA?? SIM!!!

êêêêê… \o/


[b][color=darkblue]
Nussa, deve haver um jeito melhor amigo… Programação Orientada a
Gambiarra eh fogo… :lol:

no MAAAXIMO, poderia sair algo usando pilha e notação polonesa, lendo a string caracter por caracter, convertendo em notação polonesa e calculando depois… pelo menos eh mais abrangente. :smiley:

[/color][/b]

P

http://www.google.com/codesearch?hl=en&lr=&q= scientific+calculator++lang%3Ajava&btnG=Search

valeu ?

R

[b][color=darkblue]
Hum… axo q encontrei o q vc quer mocinha

Jah viu a função eval() em ActionScript? Ela lê uma string e interpreta como uma linha de código…
O que eu axei parece funcionar da mesma forma, dah uma olhada:

:arrow: http://forum.java.sun.com/thread.jspa?threadID=474563&tstart=75

Espero que ajude! :smiley:
[/color][/b]

P

ahhh, com toda certeza existe milhares de formas de fazer…
JAVA sempre permite uma maneira melhor…

porém eu concordo com todas e qualquer solução apresentada, pois
a minha solução faz o que ela pediu, nao?!?!?!

eu não diria que eu teria coragem de apresentar esta solução para o meu cliente…

mas uma pergunta “como eu somo o conteúdo de uma String x = ‘1+2’ ?”

sem destaque nenhum, sem parênteses ou especificação de condições me faz pensar na solução mais simples possível…
pois a pergunta foi 1+2 e não 30+30, ou um + dois, seja lá o que for…
mas que a solução resolve quando for 1+2, ela resolve…

não sei se entenderam o que eu quis dizer, mas minha idéia é que devemos atender exclusivamente o que o cliente pede…
pois se caso o pedido fosse “pessoal, eu gostaria de identificar dois números e um operador em uma string e efetuar a operação, blá, blá…”
teria sido diferente com certeza minha sugestão…

rafa_boanova
tbm acho q POG é fogo eheheh…
mas atire a primeira pedra quem nunca “pecou”
olhei sua sugestão, achei mto legal…

desculpe-me moderadores se saí do assunto deste tópico, nao sei se é certo eu defender minha forma de achar solução aqui…
por favor voltemos ao assunto da renata…

R

[b][color=darkblue]
Nada contra gambiarras d vez em quando pmsoad (como a minha 1a sugestão ULTRA-TRAMPOSA :stuck_out_tongue: ), mas tbm naum vale chutar o pau da barraca…

( Não me entenda mal cara, naum quis ofender… mas tipo, a melhor solução eh aquela que soluciona tbm os futuros problemas, certo? E se ela agora resolve calcular “1 - 2”? XD )

[/color][/b]

R

PessoALL!!!

MUITO OBRIGADA!

Vcs me mandaram diversas idéias, diversas fontes, vlw msm.!

Juntando um pouco de um, um exemplo do outro, e até umas coisas q eu tinha pesquisado aqui consegui resolver.

Aliás, tentei de várias formas, até criar uma classe com o método que eu precisava e compilar e executar “on the fly” eu tentei.

Mas enfim, o que ficou melhor, mais prático e rápido foi unir o pacote de componentes que um amigo mandou (http://www.beanshell.org/download.html) com o exemplo que outro amigo mandou (http://forum.java.sun.com/thread.jspa?threadID=474563&tstart=75).

Fiz uma classe usando o exemplo e ficou exatamente como eu queria! Muito obrigado à todos por suas idéias :smiley:

Ah, e qto as POGs, sim, concordo que elas funcionam, as vezes são nossa última saída. Mas veja bem, nossa ÚLTIMA saída, enquanto eu puder eu tento lutar pra achar uma alternativa mais “elegante”…rs… Tb uso POG, mas é só no último caso. :stuck_out_tongue:

M

Hum… Era um POGzão! Mas eu costuma mandar este tipo de expressão para o banco de dados, tipo

select 1 + 2 from dual

no Oracle. Problema era do Oracle, hehehehe

Funciona…

N

oi Renata, estou precisando da msm coisa, será que vc poderia me mandar o q vc tem feito pra ver se aparece uma luz pra mim, ja me falaram de reflection tb e de expressões regulares mas num foi ainda, se puder me de um help.

thks

R

Bem amigo, como já falei nos posts anteriores, o que fiz foi baixar esse pacote de componentes:

http://www.beanshell.org/download.html

E fazer uma classe muito similar a este exemplo:

http://forum.java.sun.com/thread.jspa?threadID=474563&tstart=75

E pronto! Está tudo funcionando! :wink:

Boa sorte!

T

marciosantri:
Hum… Era um POGzão! Mas eu costuma mandar este tipo de expressão para o banco de dados, tipo

select 1 + 2 from dual

no Oracle. Problema era do Oracle, hehehehe

Funciona…

Acho que o vendedor do Oracle deve adorar você. Para fazer contas você cria uma Connection, um ResultSet e manda as coisas para o banco :stuck_out_tongue:

Isso me lembra do tempo em que as pessoas ordenavam listas de strings criando um listbox ordenado (e escondido) no VB 3.0. Para ordenar a lista, você copiava a lista para o listbox, que a ordenava e você simplesmente lia a lista de volta.
O problema é que nessa época você não podia pôr mais de 64 KB de dados em um listbox; o que ocorria é que o programa funcionava OK com poucos dados, mas dava problemas no cliente, onde havia mais dados.
Só que a pessoa que pensava desse jeito ainda pensa desse jeito até hoje; e repetiu o mesmo feito usando algo parecido no PocketPC e usando C#.
Fiquei muito admirado, já que a parte de ordenação existe pronta (e mais fácil de usar) no C#.

M

Normalmente era feito em cliente-servidor com uma conexão já pronta.
Na época o movimento Java era muito fraco e achar soluções como estas apresentadas aqui no tópico para Delphi era meio complicado.
Programadores comerciais se viram como podem; um milhão de problemas para resolver em 10 minutos! Principalmente naqueles malditos programas de folha de pagamento.

Mas eu não recomendo este tipo de prática pois depende do banco. Foi só uma sessão nostalgia mesmo…

N

é só pra ter certeza, ele só resolve equações com operações básicas ??
pois eu preciso do tipo resolver (log(x) * ln x) / sin(X) (exemplo).
Você por acaso não saberia como resolver isso, saberia?? :?: estou precisando muito disso.

Obrigado pela ajuda e atenção.

thks :slight_smile:

R

neohacker:
é só pra ter certeza, ele só resolve equações com operações básicas ??
pois eu preciso do tipo resolver (log(x) * ln x) / sin(X) (exemplo).
Você por acaso não saberia como resolver isso, saberia?? :?: estou precisando muito disso.

Obrigado pela ajuda e atenção.

thks :)

Amigo, ele não é pra resolver operações básicas. Ele é para resolver COMANDOS JAVA. No meu caso era uma expressão matemática, mas não é pra isso que ele serve. Por ex, seu eu passar pra ele uma String assim:

String x = "System.out.println('oi');";

Ele vai resolver esse comando java e vai imprimir meu “oi” no console. Sacou?

Então, para resolver suas expressões, basta que vc ache os comandos java que resolvem e colocar isso numa String, passando pra ele.

Espero ter ajudado! :stuck_out_tongue:

N

ajudado?? :?:
que isso salvou minha vida… :smiley: que muito loko isso…eu aki me matando pra saber o q fazia auhauha :x…agora sim entendi vlw RenataFA…agora soh vou dar uma tratada na String pro usuário não visualizar coisas do tipo “Math.sin” e ver soh o “sin” …mas agora ta td bemmm mais fácil auhauh…

brigadão ai pela paciência RenataFa :slight_smile: e companhia…
:wink: vlw

Criado 5 de abril de 2007
Ultima resposta 13 de abr. de 2007
Respostas 21
Participantes 9