2010-11-19 7 views
6

Hier ist die locale Alphabet Reihenfolge: wikipedia
Hier ist mein Code:Sorter sortiert nicht direkt für gegebene Locale

public static void main(String[] args) { 
    Locale loc = new Locale("sr","RS"); 

    Collator col = Collator.getInstance(loc); 
    col.setStrength(Collator.SECONDARY); 

    List<String> slova = new ArrayList<String>(); 

    slova.add("Austrija"); 
    slova.add("Slovačka"); 
    slova.add("Č"); 
    slova.add("Đ"); 
    slova.add("C"); 
    slova.add("Grčka"); 
    slova.add("Slovenija"); 
    slova.add("Španija"); 
    slova.add("Švajcarska"); 
    slova.add("Švedska"); 
    slova.add("Srbija"); 

    Collections.sort(slova,col); 

    for(String s: slova) 
     System.out.println(s); 
} 

Und hier ist der Ausgang:

Austrija
C
È
Grčka
Slovačka
Slowenien
Španija
Srbija
Švajcarska
Švedska
Đ

Wie Sie dem Link sehen können darüber nicht die richtige Reihenfolge ist.
Was mache ich falsch?

+0

Wörter beginnend mit S und Š sind gemischt und Đ soll nicht am Ende sein. – cbaby

+0

Die Annahme, dass jeder sehen kann, dass die Ausgabe falsch ist, ist stark übertrieben. –

+1

Deshalb habe ich Link mit der Reihenfolge der Buchstaben oben hinzugefügt und einen Kommentar hinzugefügt, der darauf hinweist, was mit der Ausgabe nicht stimmt. – cbaby

Antwort

-1

Gerade herausgefunden, es ist ein bekanntes Problem, verursacht durch politische und linguale Umstände. Danke für die Hilfe.

+2

Ich bin mir da nicht so sicher. Sortierregeln werden von verschiedenen Versionen von Unicode Standard (unicode.org) erfasst. Die aktuelle Standardversion (6.0) hat möglicherweise korrekte Sortierregeln für Serbien, aber Java implementiert einen früheren Snapshot. Bitte sehen Sie sich die Implementierung der ICU an: http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Collator.html und sehen Sie, ob sie den richtigen Weg sortiert. –

1

denke ich, dass das Problem sein könnte, dass es kein Land in ISO-3166 mit Code RS

+1

http://www.iso.org/iso/english_country_names_and_code_elements und wenn ich getAvailableLocales() auf Collator aufrufen, bekomme ich sr_RS unter den anderen. – cbaby

3

Wie ich auf Ihrer Seite wikipedia gefunden und @Vash seinen ISO Link. Ich denke, Sie meinen "Sr" Serbien? Dann müssen Sie "cs" als Land wählen.

Edit: Es hängt von der Java-Version, die Sie verwenden. Java 6 verwendet den neuen Standard iso.

+0

Vashs Link verweist auf veraltete ISO-Codes. Ich habe die unterstützten Gebietsschemata überprüft und Collator unterstützt sowohl sr_RS als auch das ältere sr_CS. Die Verwendung von sr_CS gibt dieselbe Ausgabe zurück. – cbaby

+0

ISO-3166 kann per Definition nicht veraltet sein. Der Link stammt aus der Java-Dokumentation. –

0

Wenn die von Ihnen gewünschte Sortierreihenfolge nicht verfügbar ist, können Sie einen eigenen Auftrag mit einer RuleBasedCollator erstellen. Erschrecken Sie nicht vor der Dokumentation dieser Klasse. Es ist so einfach wie:

String rules = "< a < b < c < ç < d ..."; 
RuleBasedCollator myRuleBased = new RuleBasedCollator(rules); 
Collections.sort(myList, myRuleBased); 
+0

Nun, es löst mein Problem nicht ganz, da ich basierend auf einer Menge dynamisch ermittelter Locales sortieren muss, was bedeuten würde, dass ich eine Regel definieren müsste, die über 40 verschiedene Sprachen umfassen würde. Selbst wenn ich bereit wäre, ein solches Monster zu schreiben, wäre es noch schlimmer, es aufrechtzuerhalten. Ich habe mich dafür entschieden, 'sr' durch ein ähnliches Gebietsschema zu ersetzen. – cbaby