Vector e tokenizer

6 respostas
M

Olá, sou iniciante e gostaria de saber onde está o erro e o porquê no algoritimo seguinte.
Este é um trabalho que o professor pediu mas na hora de compilar dá erro.

package calculadora;


import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.Vector;


public class CalculadoraSistematizacao {
		
		static String expressao;
		public static void main(String args[]){
			
			
			System.out.println(" Digite a expressão matemática" + "\n pode conter até três variáveis (x, y, z):");
		
			Scanner in = new Scanner(System.in);
			expressao = in.next();
			if(!Parenteses()){
				System.out.println("Expressão inválida!");		
			}
			if(expressao.indexOf("x") >= 0){
				System.out.println("Digite um valor para x:");
				String x1 = in.next();	
				expressao = expressao.replace("x", x1);
			}
			if(expressao.indexOf("y") >= 0){
				System.out.println("Digite um valor para y:");
				String y1 = in.next();
				expressao = expressao.replace("y", y1);
			}
			if(expressao.indexOf("z") >= 0){
				System.out.println("Digite um valor para z:");
				String z1 = in.next();
				expressao = expressao.replace("z", z1);
			}
			
			else{
				System.out.println(expressao + " = " + String.valueOf(res(expressao)));
				}
			
		}
		public static boolean Parenteses(){
			int abrepar = expressao.replaceAll("[^(]", "").length();
			int fechapar = expressao.replaceAll("[^)]", "").length();
		
			if(abrepar != fechapar){
				return false;
			}
			return true;
		}
		
		static Vector<String> Tokens(String expressao){
			Vector<String> r = new Vector<String>();
			StringTokenizer exp1;
			
			exp1 = new StringTokenizer(expressao, "()+-*/", true);
			while(exp1.hasMoreTokens()){
				String exp2 = exp1.nextToken();
				r.addElement(exp2);			
			}
			return r;
		}
		static Vector<String> Conv(Vector<String> v){
			Vector<String> r = new Vector<String>();
			Stack<String> p = new Stack<String>();
			for(int i = 0; i < v.size(); i++){
				String t = (String) v.elementAt(i);
				if(t.equals("*") || t.equals("/") || t.equals("+") || t.equals("-")){
					p.push(t);
				}
				else if(t.equals(")")){
					r.addElement(p.pop());
				}
				else if(!t.equals("(")){
					r.addElement(t);
				}
			}
			return r;
		}
		static int res(String expressao){
			Vector<String> v = Tokens(expressao);
			v = Conv(v);
			Stack<String> p = new Stack<String>();
			
			for(int i = 0; i < v.size(); i++){
				String t = (String) v.elementAt(i);
				if(t.equals("+")){
					int e2 = Integer.parseInt(p.pop());
					int e1 = Integer.parseInt(p.pop());
					p.push(String.valueOf(new Integer( e1 + e2)));
				}
				else if(t.equals("-")){
					int e2 = Integer.parseInt(p.pop());
					int e1 = Integer.parseInt(p.pop());
					p.push(String.valueOf(new Integer(e1 - e2)));
				}
				else if(t.equals("*")){
					int e2 = Integer.parseInt(p.pop());
					int e1 = Integer.parseInt(p.pop());
					p.push(String.valueOf(new Integer(e1 * e2)));
				}
				else if(t.equals("/")){
					int e2 = Integer.parseInt(p.pop());
					int e1 = Integer.parseInt(p.pop());
					p.push(String.valueOf(new Integer(e1 / e2)));
				}
				else{
					p.push(String.valueOf(new Integer(t)));
				}
			}
			return (Integer.parseInt(p.pop()));
			
		}
			
	}

6 Respostas

nel

Olá myu23.

Por favor, poste corretamente o seu código utilizando-se da tag code (faltou apenas fechar ao fim /code) e o stacktrace completo do erro.

Abraços.

M

O erro apresentado é o seguinte:

ou tem esse erro:

nel

Opa!

Olhei supercifialmente o seu código, mas assim, isso é erro:

Exception in thread "main" java.lang.NumberFormatException: For input string: "3=5" 
at java.lang.NumberFormatException.forInputString(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at java.lang.Integer.<init>(Unknown Source) 
at calculadora.CalculadoraSistematizacao.res[color=blue](CalculadoraSistematizacao.java:110)[/color] 
at calculadora.CalculadoraSistematizacao.main(CalculadoraSistematizacao.java:40)

E esta nesse linha: p.push(String.valueOf(new Integer(t)));

O valor de t ali é 3+5, ou seja, não é um número inteiro, concorda?
Ai você tenta instanciar um Integer e gera a exceção. Dá uma revisada em seu código que tenho certeza que encontrará o problema.

Outros dois detalhes, importantes.
1 - Substitua o seu Vector por um List
2 - A própria Oracle recomenda que não seja utilizada a classe StringTokenizer, ao invés disso, uso o método .split() da própria String.

Edit: link do StringTokenizer

Abraços amigo.

M

Valeu Nel!

Quanto ao vector e StringTokenizer, foi o professor que passou esses códigos.
Quanto ao list, usarei o ArrayList que parece fácil de manusear mas o split não entendi direito como e onde usá-lo.

Valeu pelas dicas.

Abraços.

nel

Que isso, surgindo dúvidas é só postar.
Seu problema foi resolvido?

No link que lhe passei acima a própria Oracle demonstra como efetuar uma substituição por um split e obtendo os mesmos resultados.
O split aceita inclusive regex, o que poderia lhe facilitar muito sua vida.

Exemplo de utilização:

String s = "Testando-o-metodo-split";
String[] result = s.split("-");
for(String value : result) {
   System.out.println(value);
}

Vai apresentar em seu console a seguinte frase:
Testando
o
metodo
split

Pois utilizei o ‘-’ como um “separador” na minha string, e desejei que o método split quebra minha string original caso encontrasse esse char ‘-’.
A idéia é essa. O que não falta na net é exemplos.

Abraços!

M

Valeu Nel, agora entendi o uso do split.

Criado 20 de maio de 2011
Ultima resposta 20 de mai. de 2011
Respostas 6
Participantes 2