2 scanners mais $ e [ ]

17 respostas
L
oi pessoal estou com duas dúvidas. vou colocar um exemplo do texto pra ficar mais facil de entender.
#sludgejunk#; quando dasinda; asdamkdas qwpeowkq; dsamk; #sdueldsacasmk#; euuu souuu; mtuiodsa; aaaaaa; perdsaa; caraaaaa; #antoniertada#; pozzzzra; deeeee; trampoo; queee naoo; pegaaa salarrr;
quero fazer 2 scanners, nesse mesmo texto, e roda-los pra passar uma vez por cada palavra, mas estou me confundindo todo com essa história de next e hasnext. esse texto é composto por 3 "partes": sludgejunk, sdueldsacasmk e antoniertada, e queria separá-las. o que eu fiz:
scfS = new Scanner(new BufferedReader(new FileReader(arquivo)));
                          scfS.useDelimiter(";");
                          scfSS = new Scanner(new BufferedReader(new FileReader(arquivo)));
                          scfSS.useDelimiter("#");
                          
                          while(scfSS.hasNext() && !abortar) {
                                  
                                  while(scfS.hasNext() && !abortar) {
                                      System.out.println("--");
                                      String str = scfS.next();
                                      System.out.println(str);
                                  }
                                  scfSS.next();
                                  System.out.println("-----------------------------------");
                      )
mas desse jeito funciona como se tivesse apenas um scanner em execução, (o do ";") e depois aparece um monte de "-----------------" que não é o que eu quero..

outro problema, é que não quero # como delimitador, quero ( $ ) ou( [ e ] ), mas quando coloco esses, o programa não lê direito... como faria nesses casos?

por fim, como selecionar a primeira palavra de cada scanner? por exemplo se eu quiser receber somente o título dele? {sludgejunk, sdueldsacasmk e antoniertada}
tem algum jeito mais inteligente do que simplesmente coloca algo do tipo .contains(separador)?

obrigado,
abraços

17 Respostas

MnF

Experimenta colocar seus delimitadores que tu quer entre " "

scfS.useDelimiter("$");

scfSS.useDelimiter("[]");

e a diferença entre o hasNext() e o next(), é que o hasNext() retorna boolean, ele verificar se há um próximo elemento e retorna true ou false.
e o next(), ele vai para o próximo elemento.

espero ter ajudado.

[]'s

L

bom, pra ser completamente sincero, não me ajudou muito não… eu já tentei colocar os “$” como você falou, não adianta, não funciona…
e quanto aos next e hasnext, eu entendi isso, o problema está mais na lógica da construção que estou tentando montar…

MnF

coloca todo o code aí pra dar uma olhada.

L

só essa parte do código que importa pra resolve esse problema…
olha como fica as saídas desses println:


#sludgejunk#

quando dasinda

asdamkdas qwpeowkq

dsamk

#sdueldsacasmk#

euuu souuu

mtuiodsa

aaaaaa

perdsaa

caraaaaa

#antoniertada#

pozzzzra

deeeee

trampoo

queee naoo

pegaaa salarrr







como dá pra perceber, o programa roda todas as palavras dentro do while de dentro, e depois que terminou roda no de fora sem entrar no de dentro…
pensei em dar reset no scfS (o de dentro) no while de fora, mas aí passaria mais de uma vez por cada palavra né…

MnF

tu coloco o que tem no arquivo, e todo o code do seu programa?
posta ai

L

o arquivo é o que está em cima, no primeiro post…
o código todo tem umas 5000 linhas, mas a parte importante é essa do primeiro post também…

pmlm

luisera:

como dá pra perceber, o programa roda todas as palavras dentro do while de dentro, e depois que terminou roda no de fora sem entrar no de dentro…
pensei em dar reset no scfS (o de dentro) no while de fora, mas aí passaria mais de uma vez por cada palavra né…

Se queres que ele volte a “passar” no de dentro tens de fazer isso mesmo, porque o scanner já chegou ao fim.

Sinceramente ainda não percebi exactamente o que pretendes fazer daí não poder ajudar muito mais.

L

eu quero percorrer o arquivo uma “parte” por vez (com o primeiro scanner), e quando acabasse essa “parte”, fosse pra outra… e dentro dessa “parte”, percorrer uma palavra por vez (com o outro scanner)…
agora, pensando, dá pra fazer uma analogia com aquele jeito de percorrer matrizes com 2 for, um dentro do outro…

for(int i = 0; i<coluna; i++) { for (int j = 0; j<linha; j++) { // aqui vai passar em todos os dados uma vez. } }

será que dá pra montar essa mesma ideia substituindo os while for for? vou tentar depois…
espero que consiga ter explicado minha ideia…

pmlm

Para isso tens realmente de inicializar o segundo scanner antes de cada ciclo interno. Mesmo assim ainda está falhando qualquer coisa nessa implementação. Não estás a fazer nada com o que obtens do primeiro ciclo. O segundo vai ser repetido x vezes (sendo x o numero de partes do primeiro) sempre com o mesmo output

L

é, eu sei, esse é o problema…
acho que não há solução para fazer do jeito que eu quero, porque ambos scanners tem, independentemente de como estão separados, o arquivo inteiro…
mas fica as outras perguntas:

  • como fazer o java ler o sifrão? e os [ ]?
  • como poderia ser um if dentro do loop pra selecionar apenas os “nomes das partes”? {sludgejunk, sdueldsacasmk e antoniertada}
pmlm
Algo como isto? (não testei)
scfS = new Scanner(new BufferedReader(new FileReader(arquivo)));  
scfS.useDelimiter(";");  
   
while(scfSS.hasNext()) {  
    aux = scfSS.next();            
    if (aux.charAt(0)=='#' && aux.charAt(aux.length()-1)=='#'){
         System.out.println(aux); //assim vai imprimir com #. é só tirar depois os #
    }  
}
L

é, talvez funcione, mais tarde quando estiver no trabalho vou testar… só que teria que ser charAt(1), porque em aux fica também o espaço da palavra anterior…
bom, parece que não tem o porque fazer 2 scanners né… vou acabar usando um só mesmo.

pmlm

Em vez de fazer charAt(1), faz

aux = scfSS.next().trim();

Ou podes também usar o matches se souberes expressões regulares.

L

acho que o trim não seria uma boa ideia nesse caso, porque aux pode receber uma palavra composta (duas palavras), e o trim separaria elas.

pmlm

O trim não separa, apenas elimina os espaços antes e depois.
" Duas palavras " ficaria como “Duas palavras”.

L

ah sim, é aí ajuda =)

Marky.Vasconcelos

Voce nao consegue esse efeito usando dois Scanners por que os dois começam do inicio e nao da onde o outro parou de ler.

Uma solução seria ter o primeiro Scanner com ("#") e depois usar o String.split(";") para ter as palavras de dentro.

Criado 23 de abril de 2009
Ultima resposta 24 de abr. de 2009
Respostas 17
Participantes 4