Ordenación y comparación de cadenas

Flash Player 10.1 y posterior, Adobe AIR 2.0 y posterior

Ordenación es el proceso de organizar cosas para que estén en un orden adecuado. Las reglas de ordenación varían sustancialmente según la configuración regional. Las reglas también son distintas si ordena una lista o compara elementos similares, como en un algoritmo de búsqueda de texto.

Durante la ordenación, las pequeñas diferencias como letras en mayúsculas y en minúsculas o los signos diacríticos como los acentos, suelen tener mucha importancia. Por ejemplo, la letra ö (o con diéresis) se considera equivalente a la letra o en francés o en inglés. La misma letra, sin embargo, corresponde a la letra z en sueco. Asimismo, en francés y en otros idiomas, un acento en una palabra determina su orden en una lista.

Al hacer búsquedas, normalmente se omiten las diferencias entre mayúscula y minúscula o los signos diacríticos para aumentar la posibilidad de encontrar coincidencias relevantes. Por ejemplo, una búsqueda de los caracteres “cote” en un documento en francés probablemente devolverá coincidencias para “cote”, “côte” y “coté”.

Uso de la clase Collator

Los métodos principales de la clase Collator son el método compare(), empleado principalmente para ordenar, y el método equals(), utilizado para coincidencia de valores.

El siguiente ejemplo muestra el distinto comportamiento de los métodos compare() y 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é 
}

El ejemplo primer crea un objeto Collator en modo SORTING para la configuración regional de francés de Francia. Seguidamente, ordena dos palabras que se distinguen únicamente en signos diacríticos. Esto muestra que la comparación SORTING distingue entre caracteres con y sin acentos.

La ordenación se realiza pasando una referencia al método sort() del objeto Collator como un parámetro al método Array.sort(). Esta técnica es una de las formas más eficaces de utilizar un objeto Collator para controlar la ordenación.

Seguidamente, el ejemplo crea un objeto en modo MATCHING. Cuando dicho objeto Collator compara las palabras, las trata como iguales. Esto muestra que los valores de comparación MATCHING son los mismos en caracteres con y sin acento.

Personalización del comportamiento de la clase Collator

De forma predeterminada, la clase Collator utiliza reglas de comparación de cadenas del sistema operativo a partir de la configuración regional y las preferencias del sistema del usuario. Es posible personalizar el comportamiento de los métodos compare() y equals() estableciendo de forma explícita diversas propiedades. La siguiente tabla contiene las propiedades y el efecto que tienen en las comparaciones:

Propiedad Collator

Efecto

numericComparison

Controla si los caracteres de dígitos se tratan como números o como texto.

ignoreCase

Controla si se tienen en cuenta las diferencias entre mayúsculas y minúsculas.

ignoreCharacterWidth

Controla si se consideran iguales formas de ancho completo y de ancho medio en determinados caracteres chinos y japoneses.

ignoreDiacritics

Controla si las cadenas que utilizan los mismos caracteres básicos pero distintos acentos o signos diacríticos se consideran iguales.

ignoreKanaType

Controla si las cadenas que se diferencian solo por el tipo de carácter kana utilizado se consideran iguales.

ignoreSymbols

Controla si los caracteres de símbolos, como los espacios, símbolos de divisa, símbolos matemáticos, etc., se omiten.

El siguiente código muestra que establecer la propiedad ignoreDiacritics en true, cambia el orden de una lista de palabras en 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