Classificando e comparando strings

Flash Player 10.1 e posterior, Adobe AIR 2.0 e posterior

Comparação é o processo de arrumar coisas na ordem apropriada. As regras de comparação variam bastante por localidade. As regras também são diferentes caso esteja classificando uma lista ou correspondendo itens similares como, por exemplo, um algoritmo de busca de texto.

Quando estiver classificando, pequenas diferenças como letras maiúsculas e minúsculas ou marcas diacríticas como acentos são geralmente significativos. Por exemplo, a letra ö (o com trema) é considerado na maioria dos casos como equivalente à letra simples o em francês ou inglês. No entanto, a mesma letra segue a letra z em sueco. Além disso, em francês e algumas outras linguagens, a última diferença de acento em uma palavra determina sua ordem em uma lista classificada.

Ao fazer uma busca, você geralmente vai querer ignorar diferenças entre maiúsculas e minúsculas ou diacríticos, para aumentar a chance de encontrar resultados relevantes. Por exemplo, uma busca pelos caracteres "cote" em um documento em francês deve provavelmente retornar resultados para “cote”, “côte” e “coté”.

Utilizando a classe Collator

Os principais métodos da classe Collator são o compare() que é utilizado primariamente para classificar, e o equals() utilizado para comparar valores.

O exemplo a seguir mostra os diferentes comportamentos dos métodos compare() e equals().

var words:Array = new  Array("coté", "côte"); 
 
var sorter:Collator = new Collator("fr-FR", CollatorMode.SORTING); 
words.sort(sorter.compare); 
trace(words); // côte,coté 
 
var matcher:Collator = new Collator("fr-FR", CollatorMode.MATCHING); 
if (matcher.equals(words[0], words[1])) 
{ 
    trace(words[0] + " = " + words[1]); // côte = coté 
}

O exemplo primeiro cria um objeto Collator no modo SORTING para a localidade French-France. Ele então classifica duas palavras que diferem pelas marcas diacríticas apenas. Isto mostra que a comparação SORTING diferencia entre caracteres com e sem acento.

A classificação é feita passando uma referência para o método sort() do objeto Collator como um parâmetro para o método Array.sort(). Esta é uma das maneiras mais eficientes de utilizar um objeto Collator para controlar a ordem de classificação.

O exemplo cria então um objeto Collator no modo MATCHING. Quando este objeto Collator compara as duas palavras, ele trata as duas como iguais. Isto mostra que a comparação MATCHING valoriza caracteres acentuados ou não da mesma forma.

Personalizando o comportamento da classe Collator

Por padrão, a classe Collator utiliza regras de comparação de string obtidas do sistema operacional com base na localidade e nas preferências do sistema do usuário. Você pode personalizar o comportamento dos métodos compare() e equals() definindo várias propriedades explicitamente. As tabela a seguir lista as propriedades e o efeito que elas tem sobre as comparações:

Propriedade Collator

Efeito

numericComparison

Controla se os caracteres de dígito são tratados como números ou texto.

ignoreCase

Controle se as diferenciação entre maiúsculas e minúsculas será ignorada.

ignoreCharacterWidth

Controla se as formas de largura total e parcial de alguns caracteres chineses e japoneses são avaliados como iguais.

ignoreDiacritics

Controla se as strings que utilizam as mesma base de caracteres exceto acentos ou outras marcas diacríticas são avaliadas como iguais.

ignoreKanaType

Controla se as cadeias de caracteres que se diferem apenas pelo tipo de caractere kana em uso serão tratadas como iguais.

ignoreSymbols

Controla se caracteres de símbolo como espaços, símbolos de moeda, símbolos matemáticos e outros são ignorados.

O código a seguir mostra que definir a propriedade ignoreDiacritics para verdadeiro muda a ordem de classificação de uma lista de palavras em francês:

var words:Array = new  Array("COTE", "coté", "côte", "Coté","cote"); 
var sorter:Collator = new Collator("fr-CA", CollatorMode.SORTING); 
words.sort(sorter.compare); 
trace(words); // cote,COTE,côte,coté,Coté 
 
sorter.ignoreDiacritics = true; 
words.sort(sorter.compare); 
trace(words); // côte,coté,cote,Coté,COTE