Sortowanie i porównywanie ciągów

Flash Player 10.1 i nowsze wersje, Adobe AIR 2.0 i nowsze wersje

Układanie to proces porządkowania elementów w prawidłowej kolejności. Reguły układania różnią się w zależności od ustawienia narodowego. Inne reguły obowiązują przy sortowaniu list, a inne przy dopasowywaniu podobnych elementów, np. w algorytmie wyszukiwania tekstu.

Podczas sortowania nawet niewielkie różnice takie, jak np. wielkie lub małe litery czy też znaki diakrytyczne takie, jak akcenty, mają często duże znaczenie. Na przykład litera ö (o umlaut) jest uznawana za najbardziej zbliżoną do zwykłej litery o w języku francuskim lub angielskim. Jednak w języku szwedzkim litera ta następuje po literze z. Ponadto w języku francuskim i innych językach różnica w ostatnim akcencie w słowie decyduje o jego kolejności na posortowanej liście.

Podczas wyszukiwania często pożądane jest nieuwzględnianie wielkości liter lub znaków diakrytycznych w celu zwiększenia prawdopodobieństwa uzyskania oczekiwanych wyników. Na przykład, wyszukiwanie znaków „cote” we dokumencie francuskojęzycznym prawdopodobnie zwróci wyniki: „cote”, „côte” i „coté”.

Korzystanie z klasy Collator

Główne metody klasy Collator to metoda compare() służąca przeważnie do sortowania oraz metoda equals() służąca do uzgadniania wartości.

Poniżej przedstawiono różne działanie metod compare() i 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é 
}

W pierwszym przykładzie najpierw tworzony jest obiekt Collator w trybie SORTING dla ustawienia narodowego francuski-Francja. Dalej następuje sortowanie dwóch słów różniących się od siebie tylko znakami diakrytycznymi. Widać, że w porównaniu SORTING rozróżniane są znaki akcentowane i nieakcentowane.

Sortowanie odbywa się poprzez przekazanie odniesienia do metody sort() obiektu Collator jako parametru do metody Array.sort(). Jest to jeden z najskuteczniejszych sposobów wykorzystywania obiektu Collator do sterowania kolejnością sortowania.

Następnie w przykładzie tworzony jest obiekt Collator w trybie MATCHING. Gdy oba słowa zostaną porównane przez obiekt Collator, będą traktowane jako równe. Pokazuje to, że porównanie MATCHING traktuje znaki akcentowane i nieakcentowane równoważnie.

Dostosowywanie działania klasy Collator

Domyślnie klasa Collator wykorzystuje reguły porównywania ciągów uzyskane z systemu operacyjnego na podstawie ustawienia narodowego i preferencji systemowych użytkownika. Można dostosować działanie metod compare() i equals() poprzez jawne skonfigurowanie różnych wartości. W poniższej tabeli wymienione zostały właściwości i ich wpływ na porównania.

Właściwość Collator

Efekt

numericComparison

Określa, czy znaki cyfrowe są traktowane jako liczby, czy jako tekst.

ignoreCase

Określa, czy różnice wielkości znaków są ignorowane, czy nie.

ignoreCharacterWidth

Określa, czy formy pełne i skrótowe niektórych znaków chińskich i japońskich są oceniane jako równoważne.

ignoreDiacritics

Określa, czy ciągi zawierające te same znaki podstawowe, lecz różne akcenty lub inne znaki diakrytyczne, są oceniane jako równoważne.

ignoreKanaType

Określa, czy ciągi różniące się tylko zastosowanym typem znaku kana są traktowane jako równoważne.

ignoreSymbols

Określa, czy znaki symboli takie, jak spacje, symbole waluty, symbole matematyczne i inne są ignorowane.

Poniższy kod przedstawia, jak ustawienie właściwości ignoreDiacritics na wartość true zmienia kolejność sortowania listy francuskich słów:

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