Dúvida - [StringTokenizer]=> [RESOLVIDO]

Boa noite!

Quero pegar um função qualquer, exemplo: 3x^3 + 2x + 2x^2, e resolve-la em partes (para fazer a derivada).

Já fiz métodos para resolver os termos simples, ex: 3x^3, consigo resolver sem problemas, agora composta como o exemplo acima eu não consigo.
Bom, gostaria de dividir a função acima composta em varias funções simples para resolve-las pelos métodos já existentes.
Tive uma ideia de dividir toda vez que o sinal de mais “+” aparecer (em algum if, seilá), porém tentei de varias formas implementar essa ideia sem sucesso, alguém poderia me ajudar ???
Agradeço.

Basta utilizar o método split do próprio Java.
Lembrando que como o caractere “+” é especial, este deve ser precedido pelos caracteres de escape “\”

Exemplo:


String expressao = "3x^3 + 2x + 2x^2";
String[] arrayString = expressao.split("\+");
for(String parteExpressao:arrayString){
	System.out.println(parteExpressao.trim());
}

[code] public static void main (String args []) {
String s = “3x^3 + 2x + 2x^2 - 4x / 5x * 56”;
StringTokenizer st;
st = new StringTokenizer( s, “+ - / *” ) ;

   while  ( st.hasMoreTokens  ()  ) {  
     System.out.println(st.nextToken()) ; 
   }  

}
[/code]

http://java.sun.com/j2se/1.5.0/docs/api/java/util/StringTokenizer.html

http://java.sun.com/j2se/1.5.0/docs/api/java/util/StringTokenizer.html#StringTokenizer(java.lang.String,%20java.lang.String,%20boolean)

bom, agora que vc ja tem tudo o que precisa,

public StringTokenizer(String str,
String delim,
boolean returnDelims)

ajude a vc mesmo, e aumente seu CVP, ter as respostas todas de graca nao vai ajudar vc em nada. Vc esta no caminho certo apenas chame o metodo acima passando true no returnDelims e faca as modificacoes necessarias.

concerteza! Acontece que estou mais ou menos umas 7 horas pesquisando e não consigoa achar uma reposta certa:

tipo montei desse jeito aqui:

 public void StringTokenizer(String str, String delim, boolean returnDelims) {

	   str = "3x^3 + 2x + 2x^2 - 4x^2";
           delim="+ -";
	   StringTokenizer st;
	   returnDelims=true;
           String TempSinal[] = new String[5];
           int cont=0;
           
          while(returnDelims){
           st = new StringTokenizer( str, delim ) ;
           
           TempSinal[cont] += delim;
           cont++;
          
        
	   while  ( st.hasMoreTokens  ()  ) {
	     System.out.println(st.nextToken()) ;
	   }
   }
 }

não consigo entender como que faço para separar os sinais + e - em um vetor, de modo que fique em sequencia posteriormente…

vc nem se quer se deu o trabalho de ler o que escrevi, nunca disse que vc deveria reinventar a roda, apenas sugeri usar o construtor que recebe um boolean que determina se os delimitadores serao tratados como tokens ou nao

onde vc tem

st = new StringTokenizer( str, delim ) ;  

ficaria assim

st = new StringTokenizer( str, delim, true ) ;  

Consegui implementar através de .split, mais de qualquer forma te agradeço muito, pois aprendi bastante sobre StringTokenizer, e era tão simples a mudança que teria que fazer no código…mas não consigui entender dessa forma… Na verdade eu verifiquei o que você escreveu e ate pesquisei muito sobre como implementar, mas como ainda sou “novato” nesse ramo, não consegui ter sucesso…tentei de varias formas ate inventar um WHILE sem sentido …rrsrsrsrsrs… vlw…ai agradeço…

o split funciona, mas o codigo fica mais ficicil de manter, caso vc decida incluir operacoes de * ou / nas expressoes tem que adicionar um if extra por operacao, segue o exemplo do usando StringTokenizer

public class TestTokens {

	public static void main(String[] args) {	
		int index = 0;		
		String s = "3x^2 + 3x^2 - 5x^3 + 7f / 51x^2 * 5fx - 5V^6x";
		
		StringTokenizer st = new StringTokenizer(s, "+-*/", true);
		String oper[] = new String[st.countTokens()/2];
		String aux2[] = new String[st.countTokens()-oper.length];

		while (st.hasMoreTokens()) {
			String token = st.nextToken();
			if (!st.tokenDelims.contains(token)) {
				aux2[index] = token;
				index++;
			} else {
				oper[index-1] = token;
			}
		}		
		System.out.println(restore(aux2, oper, oper.length));
	}

	private static String restore(String[] aux2, String[] oper, int numTokenDelimn) {
		int pos = 0;
		StringBuilder strBuilder = new StringBuilder();
		for (String element : aux2) {
			strBuilder.append(element + (pos < numTokenDelimn ? oper[pos++] : ""));
		}
		return strBuilder.toString();
	}
}

Realmente você tem razão, vou precisar na frente usar esse operadores… estava aqui estudando esse código…e a seguinte linha estava com problema:

if (!st.tokenDelims.contains(token)) {  // erro na tokenDelims

então fiz um pequena mudanaça…e ficou assim agora:

import java.util.StringTokenizer;

public class TestTokens {

	public static void main(String[] args) {	
		int index = 0;		
		String s = "3x^2 + 3x^2 - 5x^3 + 7f / 51x^2 * 5fx - 5V^6x";
		String tokenDelims="+-*/";  // coloquei os tokensDelims como String.
		StringTokenizer st = new StringTokenizer(s, tokenDelims, true);
		String oper[] = new String[st.countTokens()/2];
		String aux2[] = new String[st.countTokens()-oper.length];

		while (st.hasMoreTokens()) {
			String token = st.nextToken();
			if (!tokenDelims.contains(token)) {  // outra pequena mudança
				aux2[index] = token;
				index++;
			} else {
				oper[index-1] = token;
			}
		}		
		System.out.println(restore(aux2, oper, oper.length));
	}

	private static String restore(String[] aux2, String[] oper, int numTokenDelimn) {
		int pos = 0;
		StringBuilder strBuilder = new StringBuilder();
		for (String element : aux2) {
			strBuilder.append(element + (pos < numTokenDelimn ? oper[pos++] : ""));
		}
		return strBuilder.toString();
	}
}

Fiz um pequeno teste aqui…e parece que agora funciona beleza…heheeh valeu ai mais uma vez…abrasss

O codigo que mandei roda perfeitamente no Java 1.5.0_12, vc deve estar usando alguma outra versao.

realmente minha versão é a 1.6.0_20…mas as mudanças que fiz parece que está funcionando…eheh vlw ai

Cara…mas uma vez agradeço muito ai pela ajuda…aprendi muito sobre StringTokenizer… implementei … através da dica que você me passou… realmente é muito melhor que .split… pois estava ocorrendo alguns erros quando colocava o sinal de - (menos)…e com espaço…agora…fica certinho…vlw mesmo…segue ai uma parte do código que implementei apartir da suas dicas…vlw:

        funcao = campo_termo.getText(); // recebe a função digitda no campo:"campo_temo"

        // Incio do código que separa a funcao digitada em parte menores, através dos delmitadores"+ - "
p=0;

String s = funcao;
String delim = "+-";

StringTokenizer st = new StringTokenizer( s, delim, true ) ;


while  ( st.hasMoreTokens() ) {
     derivaP[p] = st.nextToken();

if(derivaP[p].equals("+") ){

              derivada1 += "+";
              campo_derivada.setText(derivada1);


            }
            if (derivaP[p].equals("-")){

              derivada1 += "-";
              campo_derivada.setText(derivada1);


            }
              else {
               derivaP[p] = derivaP[p];


             }