Ignorar acentuação e tamanho de letra

Olá!

Estou tentando fazer comparação entre duas Strings ignorando acentuação e tamanho das letras.
ex:

árvore == Arvore

Eu consigo fazer essa comparação com um algoritmo que achei aqui no forum , segue abaixo…

import java.util.*;
import java.text.*;

class ExemploCollator {
    public static void main(String[] args) {
        // Vamos comparar duas strings ignorando os acentos.
        String st1 = "árvore";
        String st2 = "Arvore";
        String st4 = "árvora"; // note que esta string é diferente
        Collator collator = Collator.getInstance (new Locale ("pt", "BR"));
    collator.setStrength(Collator.PRIMARY); // importante!
        if (collator.compare (st1, st2) == 0) {
            System.out.println ("e a mesma palavra");
        }


        if (collator.compare (st1, st4) != 0) {
            System.out.println ("não são a mesma palavra");
        }

    }
}

Porém quando faço essa comparação lendo as Strings de um arquivo texto que contém árvore e Arvore, ela não acha nehuma string igual!
Segue abaixo…

 while (linha_queries != null){
                
                File labels = new File(arquivo2);
                InputStream islabels = new FileInputStream(arquivo2);
                InputStreamReader isrlabels = new InputStreamReader(islabels);
                BufferedReader brlabels = new BufferedReader(isrlabels);
                String linha_labels = brlabels.readLine(); 

                    while((linha_labels != null) && (controle != 1)){

                       Collator collator = Collator.getInstance (new Locale ("pt", "BR"));
                       collator.setStrength(Collator.PRIMARY); // importante!
                    // ignora acentos e tamanho das palavras  
                        if (collator.compare (linha_queries, linha_labels) == 0) {
                            System.out.println (linha_labels+" "+linha_queries);
                             controle = 1; 
                       }

                     linha_labels = brlabels.readLine(); 
                     
                    }  


               linha_queries = brqueries.readLine();
               controle = 0;
}

Agluém sabe qual é o problema?

Obrigado

  1. Você não especificou o “encoding” do arquivo-texto que foi lido. Pode ser que o arquivo tenha sido gravado em Windows-1252 e você esteja rodando o programa em uma máquina Linux, onde o default é UTF-8, ou você tenha gravado o arquivo em UTF-8 e o programa esteja sendo rodado em uma máquina Windows, onde o padrão é Windows-1252.

  2. Pode ser que “linha_queries” e/ou “linha_labels” tenha algum caracter diferente como um espaço a mais no começo ou no fim da linha (use o “trim” para limpar os caracteres)

entanglement,

estou em uma máquina Windows… Pensei que podia ser por causa dos arquivos serem diferentes, um é arquivo txt e o outro é um arquivo maior do tipo NT. Para fazer um teste peguei uma amostra do NT coloquei em txt…
resultado: não resolveu

Depois limpei as Strings que você disse usando o trim, também não resolveu…

Vlw, abraços

acho que o entanglement quis dizer pra fazer algo mais ou menos assim:BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));

Ignorar o tamanho das palavras está funcionando, somente ignorar os acentos é que está com problemas…

Por que não fazer um método utilitário para remover os acentos, não é muito elegante, rs… mas acho que funciona public static String removerAcentos(String str){ return Normalizer.normalize(str, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); }

[quote=digaoneves]Por que não fazer um método utilitário para remover os acentos, não é muito elegante, rs… mas acho que funciona public static String removerAcentos(String str){ return Normalizer.normalize(str, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); }[/quote]

digaoneves,

esse codigo está removendo as letras com acento, minha idéia é que as letras continuem, somente quero comparar se duas palavras são iguais, ignorando acentos.

árvore = arvore

abraços

Pergunta idiota, mas… Supondo que as palavras que estão no arquivo sejam “arvore” e “ÁrvOré”.

Você tem certeza que suas variáveis linha_queries e linha_labels são “arvore” e “ÁrvOré” respectivamente?

[code]

public static void main(String[] args){
String primeiraString = “arvore”;
String segundaString = “árvore”;

if(equalsIgnoreAccents(primeiraString, segundaString){
    System.out.println("Se ignorar nossa acentuação, nós somos iguais");
}

}

public static boolean equalsIgnoreAccents(String one, String other){
if (one == null){
if (other == null){
return true;
}
return false;
}
return removerAcentos(one).equals(removerAcentos(other));
}

public static String removerAcentos(String stringAcentuada){
if (stringAcentuada == null){
return null;
}
return Normalizer.normalize(stringAcentuada, Normalizer.Form.NFD).replaceAll("[^\p{ASCII}]", “”);
}[/code]EDIT:

Só pra constar mesmo, se quiser fazer a comparação case insensitive use equalsIgnoreCase() ao invés de equals().

Vale lembrar que Strings são imutáveis.

[quote=digaoneves][code]

public static void main(String[] args){
String primeiraString = “arvore”;
String segundaString = “árvore”;

if(equalsIgnoreAccents(primeiraString, segundaString){
    System.out.println("Se ignorar nossa acentuação, nós somos iguais");
}

}

public static boolean equalsIgnoreAccents(String one, String other){
if (one == null){
if (other == null){
return true;
}
return false;
}
return removerAcentos(one).equals(removerAcentos(other));
}

public static String removerAcentos(String stringAcentuada){
if (stringAcentuada == null){
return null;
}
return Normalizer.normalize(stringAcentuada, Normalizer.Form.NFD).replaceAll("[^\p{ASCII}]", “”);
}[/code]EDIT:

Só pra constar mesmo, se quiser fazer a comparação case insensitive use equalsIgnoreCase() ao invés de equals().

Vale lembrar que Strings são imutáveis.[/quote]

Vlw!