2016-06-04 20 views
9

Ich versuche, eine Reihe von Zeichenfolgen in mazedonischem Alphabet geschrieben zu sortieren. Ich weiß, wie es geht, aber das Endergebnis ist nicht das, was ich erwartet habe. Hier ist mein Testprogramm:Sortieren Mazedonischen Alphabet mit Kollation

public class Main { 

    private static final char[] ALPHABET_ARRAY = { 
     'а', 'б', 'в', 'г', 'д', 'ѓ', 'е', 'ж', 'з', 'ѕ', 'и', 'ј', 'к', 'л', 'љ', 'м', 'н', 'њ', 'о', 'п', 'р', 'с', 'т', 'ќ', 'у', 'ф', 'х', 'ц', 'ч','џ', 'ш' }; 

    public static void main(String[] args) { 
     Collator collator = Collator.getInstance(new Locale("mk", "MK")); 
     List<String> list = new LinkedList<>(); 
     for (int i = 0; i < ALPHABET_ARRAY.length; i++) { 
      list.add("" + ALPHABET_ARRAY[i]); 
     } 
     list.sort(collator::compare); 
     list.forEach(System.out::print); 
    } 
} 

Die Buchstaben in ALPHABET_ARRAY sind in der richtigen alphabetischen Reihenfolge, aber das Programm druckt

абвгѓдежзѕијкќлљмнњопрстуфхцчџш

Aber es hätte sein sollen:

абвгдѓежзѕијкл 12мнњопрстќуфхцчџш

Gibt es ein Problem mit dem mazedonischen Kollator in Java oder mache ich etwas falsch?

+0

Sieht aus wie Java unterscheidet sich nicht zwischen "г" und "ѓ" // "к" und "ќ", aber das ist seltsam. – Tom

+1

In den Buchstaben ѓ und differs unterscheidet sich das mazedonische Alphabet von anderen kyrillischen Alphabeten wie Kroatisch und Serbisch. Dies erklärt auch, warum ihre Unicode-Werte außerhalb der übrigen Codes für die Buchstaben im mazedonischen Alphabet liegen. –

+2

Siehe auch https://en.wikipedia.org/wiki/Macedonian_alphabet#Unique_letters –

Antwort

3

Der Sortierer für das Gebietsschema "mk_MK" basiert auf der Ressource sun.text.resources.mk.CollationData_mk (CollationData_mk.java source in jdk8u repo tagged jdk8u92-b14).

Die Kollator Regeln in CollationData_mk klar 'ѓ' direkt nach 'г' und 'ќ' direkt nach 'к'.

Da es möglich ist RuleBasedCollator mit benutzerdefinierten Regeln zu schaffen, der einfachste Weg, die Sortierreihenfolge zu erhalten, die Sie brauchen, ist die Regeln von CollationData_mk zu modifizieren ein wenig:

public static Collator createMacedonianCollator() throws ParseException { 
    // the defaults are defined in non-public sun.util.locale.provider.CollationRules 
    // they are used internally in sun.util.locale.provider.CollatorProviderImpl 
    // we have no direct access to proper defaults, so we will simply comment entries which depend on them 
    String DEFAULTRULES = ""; 
    // we will move the entries for ѓ and ќ only, leaving everything else as is 
    return new RuleBasedCollator(DEFAULTRULES + 
      //"& 9 < \u0482 " +  // thousand sign 
      //"& Z " +    // Arabic script sorts after Z's 
      "< \u0430 , \u0410" + // a 
      "< \u0431 , \u0411" + // be 
      "< \u0432 , \u0412" + // ve 
      "< \u0433 , \u0413" + // ghe 
      "; \u0491 , \u0490" + // ghe-upturn 
      "; \u0495 , \u0494" + // ghe-mid-hook 
      /*!!!moved after д/de!!!*/ //"; \u0453 , \u0403" + // gje 
      "; \u0493 , \u0492" + // ghe-stroke 
      "< \u0434 , \u0414" + // de 
      /*!!!moved AND relation strength changed!!!*/ "< \u0453 , \u0403" + // gje 
      "< \u0452 , \u0402" + // dje 
      "< \u0435 , \u0415" + // ie 
      "; \u04bd , \u04bc" + // che 
      "; \u0451 , \u0401" + // io 
      "; \u04bf , \u04be" + // che-descender 
      "< \u0454 , \u0404" + // uk ie 
      "< \u0436 , \u0416" + // zhe 
      "; \u0497 , \u0496" + // zhe-descender 
      "; \u04c2 , \u04c1" + // zhe-breve 
      "< \u0437 , \u0417" + // ze 
      "; \u0499 , \u0498" + // zh-descender 
      "< \u0455 , \u0405" + // dze 
      "< \u0438 , \u0418" + // i 
      "< \u0456 , \u0406" + // uk/bg i 
      "; \u04c0 " +   // palochka 
      "< \u0457 , \u0407" + // uk yi 
      "< \u0439 , \u0419" + // short i 
      "< \u0458 , \u0408" + // je 
      "< \u043a , \u041a" + // ka 
      "; \u049f , \u049e" + // ka-stroke 
      "; \u04c4 , \u04c3" + // ka-hook 
      "; \u049d , \u049c" + // ka-vt-stroke 
      "; \u04a1 , \u04a0" + // bashkir-ka 
      /*!!!moved after т/te!!!*/ //"; \u045c , \u040c" + // kje 
      "; \u049b , \u049a" + // ka-descender 
      "< \u043b , \u041b" + // el 
      "< \u0459 , \u0409" + // lje 
      "< \u043c , \u041c" + // em 
      "< \u043d , \u041d" + // en 
      "; \u0463 " +   // yat 
      "; \u04a3 , \u04a2" + // en-descender 
      "; \u04a5 , \u04a4" + // en-ghe 
      "; \u04bb , \u04ba" + // shha 
      "; \u04c8 , \u04c7" + // en-hook 
      "< \u045a , \u040a" + // nje 
      "< \u043e , \u041e" + // o 
      "; \u04a9 , \u04a8" + // ha 
      "< \u043f , \u041f" + // pe 
      "; \u04a7 , \u04a6" + // pe-mid-hook 
      "< \u0440 , \u0420" + // er 
      "< \u0441 , \u0421" + // es 
      "; \u04ab , \u04aa" + // es-descender 
      "< \u0442 , \u0422" + // te 
      "; \u04ad , \u04ac" + // te-descender 
      "< \u045b , \u040b" + // tshe 
      /*!!!movedAND relation strength changed!!!*/ "< \u045c , \u040c" + // kje 
      "< \u0443 , \u0423" + // u 
      "; \u04af , \u04ae" + // straight u 
      "< \u045e , \u040e" + // short u 
      "< \u04b1 , \u04b0" + // straight u-stroke 
      "< \u0444 , \u0424" + // ef 
      "< \u0445 , \u0425" + // ha 
      "; \u04b3 , \u04b2" + // ha-descender 
      "< \u0446 , \u0426" + // tse 
      "; \u04b5 , \u04b4" + // te tse 
      "< \u0447 , \u0427" + // che 
      "; \u04b7 ; \u04b6" + // che-descender 
      "; \u04b9 , \u04b8" + // che-vt-stroke 
      "; \u04cc , \u04cb" + // che 
      "< \u045f , \u040f" + // dzhe 
      "< \u0448 , \u0428" + // sha 
      "< \u0449 , \u0429" + // shcha 
      "< \u044a , \u042a" + // hard sign 
      "< \u044b , \u042b" + // yeru 
      "< \u044c , \u042c" + // soft sign 
      "< \u044d , \u042d" + // e 
      "< \u044e , \u042e" + // yu 
      "< \u044f , \u042f" + // ya 
      "< \u0461 , \u0460" + // omega 
      "< \u0462 " +   // yat 
      "< \u0465 , \u0464" + // iotified e 
      "< \u0467 , \u0466" + // little yus 
      "< \u0469 , \u0468" + // iotified little yus 
      "< \u046b , \u046a" + // big yus 
      "< \u046d , \u046c" + // iotified big yus 
      "< \u046f , \u046e" + // ksi 
      "< \u0471 , \u0470" + // psi 
      "< \u0473 , \u0472" + // fita 
      "< \u0475 , \u0474" + // izhitsa 
      "; \u0477 , \u0476" + // izhitsa-double-grave 
      "< \u0479 , \u0478" + // uk 
      "< \u047b , \u047a" + // round omega 
      "< \u047d , \u047c" + // omega-titlo 
      "< \u047f , \u047e" + // ot 
      "< \u0481 , \u0480"  // koppa 
    ); 
} 

Die Regeln vereinfacht werden kann weiter enthalten nur die Basis 31 Buchstaben ohne akzentuierte Varianten.

+1

Und im Idealfall sollte jemand ein Problem in https://bugs.openjdk.java.net erstellen, das das Problem mit 'CollationData_mk' beschreibt und einige korrekte Verweise auf die korrekten Sortierregeln für das mazedonische Gebietsschema zitiert. –

+0

Vielen Dank! Und tatsächlich habe ich bereits einen Fehler auf http://bugs.java.com eingereicht. Wenn es genehmigt wird, werde ich einen Link zu meiner Frage für die Nachwelt hinzufügen. –