Java - Sortowanie alfabetycznie wg polskich liter
import java.util.*;
import java.io.*;
import java.text.*;
public class sort {
public static void main(String args[]) {
String slowa[] = { "Słowa", "żłobek", "żółw", "Żółć",
"Sznurek", "żar", "Świstak", "samochód", "Pies", "sąd"};
Locale.setDefault(new Locale("pl","PL"));
PrintWriter ekran=null;
try {
ekran=new PrintWriter(new OutputStreamWriter(System.out,"CP852"),true);
} catch(UnsupportedEncodingException e) {
System.out.println("Nie można zainicjować strony kodowej CP852");
ekran=new PrintWriter(new OutputStreamWriter(System.out),true);
}
ekran.println("Tradycyjnie:");
Arrays.sort(slowa);
for (int i=0; i < slowa.length; i++) {
ekran.println(slowa[i] + " ");
}
ekran.println("\nPoprawnie:");
Arrays.sort(slowa, Collator.getInstance());
for (int i=0; i < slowa.length; i++) {
ekran.println(slowa[i] + " ");
}
}
}
W tablicy slowa[] umieśćmy sobie kilka wyrazów zawierających polskie znaki. Będziemy je sortować. Od razu możemy ustawić sobie odpowiedni język, w którym odbędzie się sortowanie. Odpowiada za to obiekt Locale, dla którego tworzymy język polski: "pl" i "PL" zgodnie ze standardami.
Dalej inicjowany jest "polski" ekran, aby pojawiły się na nim napisy w naszym języku, a nie krzaczki - sposób opisany jest w oddzielnej poradzie, więc nie ma sensu się nad nim rozwodzić.
Aby posortować tablicę z wyrazami korzystamy z metody sort(). Pierwsze wywołanie tej metody posortuje nam znaki, ale nie będą one poprawnie posortowane:
Dzieje się tak, ponieważ program nie wie według reguł jakiego języka ma sortować wyrazy (traktuje je jako wyrazy angielskie) i gubi się tam, gdzie występują znaki polskie.
Na szczęście w metodzie sort() można określić w drugim parametrze sposób sortowania. Wywołanie metody Collator.getInstance() spowoduje pobranie ustawień lokalnych (dlatego ustawiliśmy wcześniej Locale dla języka polskiego). I teraz sortowanie odbędzie się zgodnie z naszą gramatyką:
W ten sposób można zdefiniować sortowanie według dowolnego języka. Ponieważ w Javie można skorzystać ze stałych dla kilku języków (ale nie dla polskiego), zamiast deklarować Locale można wprost w metodzie sortującej podać język. Dla języka francuskiego byłoby to:
Arrays.sort(slowa, Collator.getInstance(Locale.FRENCH));
.png)
0 komentarze: