[Resolvido] Sobrescrever método replaceAll da classe String?
5 respostas
U
usuarioNoob
Olá,
Estava eu tentando substituir ocorrências de um determinada String em um arquivo de texto, o problema é que por ser um arquivo muito grande torna-se muito despendioso a pesquisa. A ideia é substituir cada ocorrência com uma indicação de sua posição. Dessa forma acharia que a melhor maneira seria sobrescrever algum método replace da classe String.
Alguém tem alguma idéia de como posso fazer?
Ex :
//Atualmente tenho essa como um solução, mas não é tão viável, no meu caso ....Stringstr="Uma tma asdfma asdmaf";intpos=-1;intcontagem=0;while(str.contains("ma")){str=str.replaceFirst("ma","m$a"+contagem);contagem++;}str=str.replaceAll("m$a","ma");saída->("Uma0 tma1 asdfma2 asdma3f");
Obs.: Pesquisei um pouco sobre métodos de busca, mas mesmo implementando o método de Boyer-Moore-Horspool, que inclusive achei um implementação em java. Mas de qualquer forma leva certa de 3 a 4 min, para completar.
Você não vai poder sobrescrever métodos da classe String pelo fato de ela ser uma classe final.
Talvez a classe StringTokenizer ou a classe StringUtils de commons-lang te forneça alguns métodos auxiliares que te ajudarão a fazer o que você precisa.
U
usuarioNoob
Obrigado ,[color=blue]pmlm [/color]e [color=blue]bsl.lacerda[/color]. Irei continuar tentando fazer uma solução viavel para meu caso.Vlw
Rodrigo_Sasaki
bsl.lacerda:
Olá!
Você não vai poder sobrescrever métodos da classe String pelo fato de ela ser uma classe final.
Talvez a classe StringTokenizer ou a classe StringUtils de commons-lang te forneça alguns métodos auxiliares que te ajudarão a fazer o que você precisa.
Uma coisa que sempre ressalto quando vejo uma sugestão assim. Evitem usar StringTokenizer, ela é uma classe legado, mantida somente por motivos de compatibilidade.
Não é que ela não funcione, mas a documentação diz que seu uso deve ser evitado, e que se deve usar o método split, ou o pacote java.util.regex
U
usuarioNoob
Encontrei um solução, com a dica do [color=blue]pmlm[/color] estudei um pouco os algoritmos utilizados e conseguir um boa otimização de 3 min, para menos de 2 seg.
É [color=blue]Rodrigo Sasaki[/color] é uma classe antiga a StringTokenizer, e é bom evitar mesmo.
Bom agradeço a todos pela ajuda e ficou assim o interessante do código.
Stringstr="AAAAAAAAAAAAA AAAAAA";//Código de chamadaPatternpattern=Pattern.compile("A");Matchermatcher=pattern.matcher(str);intcontadorOcorrencias=0;CharSequencec=null;while(matcher.find()){contadorOcorrencias++;}Arquivo.escreverArquivo("sadf.txt",replace(str,"A ",contadorOcorrencias));//Método visto na página do **commons-lang**.publicstaticStringreplace(Stringtext,Stringreplace,intmax){if(text==null||max==0){returntext;}intmin=0;StringBufferbuf=newStringBuffer(text.length());intstart=0,end=0;while((end=text.indexOf(replace,start))!=-1){buf.append(text.substring(start,end)).append("A"+min);start=end+replace.length();if(min++==max){break;}}buf.append(text.substring(start));returnbuf.toString();}