2013-03-20 10 views
5

Ich wollte sortierte polnische Namen aller verfügbaren Sprachen drucken.Sortierung String mit nicht-westlichen Zeichen

import java.util.*; 

public class Tmp 
{ 
    public static void main(String... args) 
    { 
    Locale.setDefault(new Locale("pl","PL")); 
    Locale[] locales = Locale.getAvailableLocales(); 
    ArrayList<String> langs = new ArrayList<String>(); 
    for(Locale loc: locales) { 
     String lng = loc.getDisplayLanguage(); 
     if(!lng.trim().equals("") && ! langs.contains(lng)){ 
     langs.add(lng); 
     } 
    } 
    Collections.sort(langs); 
    for(String str: langs){ 
     System.out.println(str); 
    } 
    } 
} 

Leider habe ich Probleme mit dem Sortierbereich. Die Ausgabe lautet:

: 
: 
kataloński 
koreański 
litewski 
macedoński 
: 
: 
węgierski 
włoski 
łotewski 

Leider gibt es in polnischen ł kommt nach l und vor m so sollte die Ausgabe sein:

: 
: 
kataloński 
koreański 
litewski 
łotewski 
macedoński 
: 
: 
węgierski 
włoski 

Wie kann ich das erreichen? Gibt es eine universelle, nicht sprachabhängige Methode (sagen wir, ich möchte dies jetzt anzeigen und in einer anderen Sprache mit anderen Sortierregeln sortieren).

+1

haben Sie diese Lösung überprüft? http://stackoverflow.com/questions/12889760/sort-list-of-strings-with-localization – Abdul

Antwort

4

Sie sollten einen Sorter in der Sortier Methode übergeben:

// sort according to default locale 
Collections.sort(langs, Collator.getInstance()); 

Die Standardsortierreihenfolge durch die Unicode-Codepoints im String definiert ist, und das ist nicht die richtige alphabetische Reihenfolge in jeder Sprache.

2

Werfen Sie einen Blick auf java.text.Collator.newInstance(Locale). Sie müssen in Ihrem Fall das polnische Gebietsschema angeben. Collatoren implementieren die Schnittstelle Comparator, sodass Sie diese in Sortier-APIs und in sortierten Datenstrukturen wie TreeSet verwenden können.

6

versuchen

Collections.sort(langs, Collator.getInstance(new Locale("pl", "PL"))); 

es produzieren

... 
litewski 
łotewski 
... 

Col sehen lator API für Details

0

Ich habe mit dem gleichen Problem zu tun. Ich habe festgestellt, dass die Lösung für den lokalen Collector für Android 7.0 funktioniert, aber nicht für frühere Android-Versionen. Ich habe den folgenden Algorithmus implementiert. Es ist ziemlich schnell (ich sortiere mehr als 3000 Saiten) und macht es auch auf früheren Android-Versionen.

public class SortBasedOnName implements Comparator { 

    private Map<Character, Integer> myCharMap; 
    private final static Map<Character, Integer>myPolCharTable = new HashMap<Character, Integer>(); 
    static { 
     myPolCharTable.put(' ',0x0020); 
     myPolCharTable.put('!',0x0021); 
     myPolCharTable.put('"',0x0022); 


     myPolCharTable.put('a',0x0040); 
     myPolCharTable.put('ą',0x0041); 
     myPolCharTable.put('b',0x0042); 
     myPolCharTable.put('c',0x0043); 
     myPolCharTable.put('ć',0x0044); 


     myPolCharTable.put('{',0x0066); 
     myPolCharTable.put('|',0x0067); 
     myPolCharTable.put('}',0x0068); 
    } 

    public SortBasedOnName() {} 

    public int compare(Object o1, Object o2) { 

     Dictionary dd1 = (Dictionary) o1; 
     Dictionary dd2 = (Dictionary) o2; 

    return strCompareWithDiacritics(dd1.getOriginal(), dd2.getOriginal()); 
    } 

    private int strCompareWithDiacritics(String s1, String s2) { 

     int i = 0; 
     int result = 0; 
     int length =0; 

     s1 = s1.toLowerCase(); 
     s2 = s2.toLowerCase(); 
     if (s1.length() > s2.length()) { 
      result = 1; 
      length = s2.length(); 
     } else if (s1.length() < s2.length()) { 
      result = -1; 
      length = s1.length(); 
     } else if (s1.length() == s2.length()) { 
      result = 0; 
      length = s1.length(); 
     } 

     try { 
      while (i <length) { 
       if (myPolCharTable.get(s1.charAt(i)) > myPolCharTable.get(s2.charAt(i))) { 
        result = 1; 
        break; 
       } else if (myPolCharTable.get(s1.charAt(i)) < myPolCharTable.get(s2.charAt(i))) { 
        result = -1; 
        break; 
       } 
       i++; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 
}