Class Scanner + Token

4 respostas
G

Pessoal a class Scanner varre uma leitura tipo arquivo ou E/S do usuario o que quero saber se gando eu uso um scanner do tipo String ele divide a string em tokens tipo assim:
Entrada
15423

O que eu espero

1
5
4
2
3

O que sai no console
15423
Ai pintou a duvida. Como faço para ver td is numeros separados?
Eu fiz isto aqui:

BigInteger b = new BigInteger("2");
	     b = b.pow(1000);
		 String num = " " + b;
		 int i=0;
		 
		 try{
		 
		      Scanner scan = new Scanner(num);
		       
		        while(scan.hasNext()){
		  	      System.out.println(scan.next());
		  	      
		  }
		  scan.close();
		 
		 }catch(Exception e){
			System.out.println(e);
		}

No explicado acima acho que só o numero que gerei é o token. E o scanner ta lendo só uma vez, isto é, todo o numero sem separar.
Como poderei arrumar isso ai?
grato pela ajuda.

4 Respostas

T

Olhando o javadoc dá a impressão que você tem de usar next ("."), em vez de simplesmente next().
Mas é questão de testar.

LPJava

o ( . ) parece que signigica qualquer coisa…

maior_abandonado

vc quer separar em tokens...ok... mais o que que define aonde q termina seu token e começa o seguinte? espaço?

tipo, se eu nao me engano tem um metodo de String que joga em um array os tokens da string usada separando por espaço, não me lembro o nome.

vc tb pode usar algum codigo seu, exemplo de algo bem simples:

String frase="aaa bbb ccc";
String[] tokens=new String[50];

int tamanho=frase.length();

int comecoToken=0, fimToken=0, j=0;

for (int i=0;i<tamanho;i++){
  
   if (frase.substring(i,i+1).equals(" "){//esse if verifica se o caracter é um espaço

        fimtoken=i;//to usando o caracter do espaço pois ele é um depois, do final, como o metodo usado abaixo exige
        tokens[j]=frase.substring(comecoToken, fimtoken);
        inicioToken=i+1;//se eu pegasse i eu incluiria espaço
   }

}

esse codigo não é dos melhores, mais didaticamente acho bom pq é facil de intender, o problema é que se digita 2 espaços zoa ele, coloca espaço no começo zoa ele... eu tinha feito um lexico a uns dias atras tratando isso tudo, e jogando os tokens numa arrayList, mais o codigo fico meio feinho, axo da pra intende numa boa apersar disso...

bom...segue ele ai:

boolean comT=false, palavraExiste=false;
        int comecoT=0;
        String saida="";
        ArrayList<String> token=new ArrayList();
        
        for (int i=0;i<frase.length();i++){
            
            //comT controla se o token começo, começa se 
            //o caracter sendo verificado não for espaço
            if (comT==false){
                if (!frase.substring(i, i+1).equals(" ")){
                    comecoT=i;
                    comT=true;
                }   
                
            //se cair no else é pq ja começo o token, começa a le-lo    
            }else{
                
                //esse if serve pra descobrir que o token acabou (encontrando espaço
                //no final do token ou o proprio final da frase, e coloca o token
                //dentro do arrayList token, depois diz aonde começa o proximo token no if acima
                //e reseta a comToken pra nao pega token enquanto nao ver o começo dele
                if (frase.substring(i, i+1).equals(" ")){
                    token.add(frase.substring(comecoT, i));
                     comecoT=i+1;
                     comT=false;
                }
            }
        }
        if (!(comecoT==frase.length()))
            token.add(frase.substring(comecoT));
           
        //só pra demonstrar que separo ok os tokens da frase
        for (int i=0;i<token.size();i++){
            System.out.println(token.get(i));
        }

essa parte ai é só parte do metodo, a responsavel por fazer o que vc falo, separa em tokens...ai com isso vc pega o conteudo do seu scaner e joga nessa String frase ai q eu usei no for...

R

Tenta usando Pattern e Matcher:

public static void main(String[] args) {
	BigInteger b = new BigInteger("2");
	b = b.pow(10);
	String num = "" + b;

	Matcher matcher = Pattern.compile(".").matcher(num);
	while(matcher.find()) {
		System.out.println(matcher.group());
	}
}
Criado 4 de outubro de 2007
Ultima resposta 5 de out. de 2007
Respostas 4
Participantes 5