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
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!