Ajuda com lógica de substring  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
thegoergen
Virtual Machine Man
[Avatar]

Membro desde: 24/09/2007 09:44:03
Mensagens: 583
Localização: Estrela/RS
Offline

Pessoal... Estou em um dia de "bloqueio mental" hoje...

Eu tenho uma String com varios ".", e preciso pegar uma substring até um nível passado. Por exemplo:

Tenho a String "1.22.333.4444.55555", e quero o terceiro nível, deve retornar "1.22.333". Se quiser o quarto nível, retorna "1.22.333.4444".

Só que nao consegui pegar algo como o indexOf predefinido, do tipo: "Quero a posicao da terceira ocorrência de tal caractere"...

Alguém pode me dar uma luz?

Ah.. e preciso disso com um desempenho excelente, porque é um processo demorado e está em um laço quase que gigantesco...

Agradeço desde já

"A preguiça de pensar é a maior burrice de uma pessoa." (Diego Inácio Goergen)

CV: Diego Inácio Goergen

Administrador da UNISCWiki e Medicina UNISC
[WWW] [MSN] [ICQ]
Sagatiba
JavaBaby

Membro desde: 03/02/2009 11:15:20
Mensagens: 85
Offline

Cara usa StringTokenizer

http://java.sun.com/javase/6/docs/api/java/util/StringTokenizer.html

Dai ele separa a String principal em varios tokens (pedacos de string) separados e vc pega o indice que vc quiser.

This message was edited 1 time. Last update was at 03/02/2009 15:10:25

vinidouradoh
JavaBaby
[Avatar]

Membro desde: 11/06/2008 06:52:01
Mensagens: 75
Localização: Salvador - BA
Offline

já tentou o StringTokenizer?

vlw

Vinicius Brito de Castro Dourado

MSN: vinidouradoh@hotmail.com
SKYPE: vinicius.dourado
[MSN]
spycall
JavaTeenager
[Avatar]

Membro desde: 26/04/2005 14:29:59
Mensagens: 189
Localização: São paulo
Offline

Você pode usar o StringTokenizer usando o "." como separador.

Ele vai te retornar um arry de strings, daí é só você fazer um "for" até o nivel que vc quer.

No mundo existem 10 tipos de pessoas, as que conhecem e as que não conhecem binário.
[MSN]
thegoergen
Virtual Machine Man
[Avatar]

Membro desde: 24/09/2007 09:44:03
Mensagens: 583
Localização: Estrela/RS
Offline

Valeu todo mundo

Eu que nao tava me lembrando do StringTokenizer...

Resolvi assim:


"A preguiça de pensar é a maior burrice de uma pessoa." (Diego Inácio Goergen)

CV: Diego Inácio Goergen

Administrador da UNISCWiki e Medicina UNISC
[WWW] [MSN] [ICQ]
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

Mas nem precisa de StringTokenizer... o método spit da classe String já faz o trabalho sujo...

Ou seja, a partir do índice do array palavras você pode pegar a parte que quiser.

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
thegoergen
Virtual Machine Man
[Avatar]

Membro desde: 24/09/2007 09:44:03
Mensagens: 583
Localização: Estrela/RS
Offline

marcobiscaro2112 wrote:Mas nem precisa de StringTokenizer... o método spit da classe String já faz o trabalho sujo...

Ou seja, a partir do índice do array palavras você pode pegar a parte que quiser.



E qual modo é mais rápido, será?

"A preguiça de pensar é a maior burrice de uma pessoa." (Diego Inácio Goergen)

CV: Diego Inácio Goergen

Administrador da UNISCWiki e Medicina UNISC
[WWW] [MSN] [ICQ]
Pedrosa
JWizard
[Avatar]

Membro desde: 13/07/2005 13:08:08
Mensagens: 2505
Localização: São Paulo - Brasil
Offline

Use Split que é mais rápido, StringTokenizer era o jeito antigo, com o foreach olha como o código ficou mais limpo!

This message was edited 1 time. Last update was at 03/02/2009 15:52:09

thegoergen
Virtual Machine Man
[Avatar]

Membro desde: 24/09/2007 09:44:03
Mensagens: 583
Localização: Estrela/RS
Offline

Fiz um testezinho de desempenho, e o Tokenizer se saiu melhor:

Com este codigo:


Eu obtive essa saída:

"A preguiça de pensar é a maior burrice de uma pessoa." (Diego Inácio Goergen)

CV: Diego Inácio Goergen

Administrador da UNISCWiki e Medicina UNISC
[WWW] [MSN] [ICQ]
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

Só mais uma coisa: eu usaria StringBuilder para as variáveis ret, pois melhora ainda mais o desempenho. Apesar de o Tokenizer se sair um pouco mais rápido em algumas vezes, como já dito ele já é um "idoso" e eu considero mais legível o código com o split. Mais aí vai de cada um.

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

thegoergen wrote:
marcobiscaro2112 wrote:Mas nem precisa de StringTokenizer... o método spit da classe String já faz o trabalho sujo...

Ou seja, a partir do índice do array palavras você pode pegar a parte que quiser.



E qual modo é mais rápido, será?


po...testa ai... da um System.currentTimeMillis(); antes e depois do processo e subtrai o primeiro do segundo, o que da um valor menor é o mais rápido...

edit...até eu falar pra vc testar vc ja tinha feito...rs

This message was edited 1 time. Last update was at 03/02/2009 16:01:52


espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

De fato, também fiz uns testes e o StringTokenizer é mais rápido. Mas a diferença só é significativa para enormes quantidades. A média de diferença é de 0,1 milissegundo por iteração. A adaptação para o StringBuilder ficaria assim:

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
Pedrosa
JWizard
[Avatar]

Membro desde: 13/07/2005 13:08:08
Mensagens: 2505
Localização: São Paulo - Brasil
Offline

Realmente StringTokenizer é mais rápida que loucura, alguém me explica como uma classe antiga pode ser mais rápida:



Mas cuidado ao concatenar String evite o += sempre use StringBuilder com append.

This message was edited 1 time. Last update was at 04/02/2009 10:13:36

marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

Por que é mais rápida eu não sei, mas a documentação é bem clara quanto ao seu uso:

...
StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
...

Ou seja, ainda existe apenas para compatibilidade com programas antigos. Não use em códigos novos! Use o split da classe String ou o pacote java.util.regex.

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
thegoergen
Virtual Machine Man
[Avatar]

Membro desde: 24/09/2007 09:44:03
Mensagens: 583
Localização: Estrela/RS
Offline

Usando StringBuilder ficou ainda mais rápido.

Valeu pra todo mundo, e me desculpem, mas eu já nem preciso mais disso, mudei minha lógica...

Sobre tokenizer ser antigo, ele deve ser mais simples talvez, por isso fica mais rápido... sei lá...

"A preguiça de pensar é a maior burrice de uma pessoa." (Diego Inácio Goergen)

CV: Diego Inácio Goergen

Administrador da UNISCWiki e Medicina UNISC
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team