[Resolvido] Sobrescrever método replaceAll da classe String?

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 :[code] //Atualmente tenho essa como um solução, mas não é tão viável, no meu caso …
String str=“Uma tma asdfma asdmaf”;
int pos = -1;
int contagem = 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”);
[/code]
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.

Podes ver como fizeram na commons-lang.

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.

Obrigado ,[color=blue]pmlm [/color]e [color=blue]bsl.lacerda[/color]. Irei continuar tentando fazer uma solução viavel para meu caso.Vlw

[quote=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.[/quote]

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

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.

[code]
String str =“AAAAAAAAAAAAA AAAAAA”;

  //Código de chamada
Pattern pattern = Pattern.compile("A");   
	Matcher matcher = pattern.matcher(str);    

	int contadorOcorrencias = 0;  
	CharSequence c = null;
	while(matcher.find()){  
	     contadorOcorrencias++;       
	} 
	Arquivo.escreverArquivo("sadf.txt", replace(str,"A ", contadorOcorrencias));

//Método visto na página do commons-lang.
public static String replace(String text, String replace, int max) {
if (text == null || max == 0) {
return text;
}
int min=0;
StringBuffer buf = new StringBuffer (text.length());
int start = 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));
    return buf.toString();
}[/code]

Vlw