2013-03-20 24 views
5

Tüm mevcut dillerden seçilen sıralı Lehçe isimlerini yazdırmak istedim.Batı olmayan karakterlerle Dize Sıralama

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

Ne yazık ki sıralama bölümü ile ilgili bir sorunum var. çıkışı: Maalesef Polonya ł yılında

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

l sonra gelen ve m önce bu kadar çıktı olmalıdır:

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

Bunu başarmak nasıl? Evrensel olmayan dil bağımlı bir yöntem var mı (şimdi bunu görüntülemek ve başka bir dilde başka bir sıralama kuralları ile sıralamak istiyorum).

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

varsayılan sıralama düzeni dizesinde Unicode codepoints tanımlanır ve bu herhangi bir dilde doğru alfabetik emir değil:

+1

Bu çözümü kontrol ettiniz mi? http://stackoverflow.com/questions/12889760/sort-list-of-strings-with-localization – Abdul

cevap

4

sort yöntemine Collator geçmelidir.

2

java.text.Collator.newInstance(Locale)'a bakın. Durumunuza Polonya yerel ayarını sağlamanız gerekiyor. Kolajörler, Comparator arabirimini uygular, böylece bunları sıralama API'larında ve TreeSet gibi sıralanmış veri yapılarında kullanabilirsiniz.

6

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

deneyin Daha fazla bilgi için lator API

0

Aynı problemle uğraşacağım. Yerel toplayıcı çözümünün android 7.0 için iyi çalıştığını, ancak önceki Android sürümlerinde bulunmadığını buldum. Aşağıdaki algoritmayı uygulamam. Oldukça hızlı (3000 dizgiden daha fazlasını sıralıyorum) ve daha önceki Android sürümlerinde de yapıyor.

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