2013-03-20 6 views
5

Desidera stampare i nomi polacchi ordinati di tutte le lingue disponibili.Stringa di ordinamento con caratteri non occidentali

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

Purtroppo ho un problema con la parte di smistamento. L'output è:

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

Purtroppo in polacco ł viene dopo l e prima m così l'output dovrebbe essere:

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

Come posso fare questo? Esiste un metodo universale non dipendente dalla lingua (diciamo che ora voglio mostrarlo e ordinare in un'altra lingua con altre regole di ordinamento).

+1

hai controllato questa soluzione? http://stackoverflow.com/questions/12889760/sort-list-of-strings-with-localization – Abdul

risposta

4

si dovrebbe passare un Collator per il metodo di ordinamento: ordinamento

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

Il valore di default è definita dalle codepoints Unicode nella stringa, e che non è l'ordine alfabetico in qualsiasi lingua.

2

Dai un'occhiata a java.text.Collator.newInstance(Locale). Devi fornire le impostazioni locali polacche nel tuo caso. Collators implementa l'interfaccia Comparator, quindi è possibile utilizzarla nelle API di ordinamento e in datastrutture ordinate come TreeSet.

6

provare

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

produrrà

... 
litewski 
łotewski 
... 

vedere Col lator API per i dettagli

0

Sto affrontando lo stesso problema. Ho trovato che la soluzione di raccolta locale funziona bene per Android 7.0, ma non su versioni precedenti di Android. Ho implementato il seguente algoritmo. È piuttosto veloce (ho risolto più di 3000 stringhe) e lo faccio anche nelle versioni precedenti di Android.

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; 
    } 
} 
Problemi correlati