Java - Sortowanie alfabetycznie wg polskich liter

12:07 0 Comments



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));

ziomyslaw

Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.

0 komentarze: