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

5 respostas
U

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 ....
 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");
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.

5 Respostas

pmlm

Podes ver como fizeram na commons-lang.

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.

U

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

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.
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();
    }
Vlw
Criado 9 de dezembro de 2012
Ultima resposta 10 de dez. de 2012
Respostas 5
Participantes 4