2013-03-20 4 views
5

Я хотел распечатать отсортированные польские имена всех доступных языков.Сортировка Строка с незападающими символами

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

К сожалению, у меня есть проблема с сортировочной частью. Выход:

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

К сожалению, в польском ł приходит после того, как l и перед m поэтому выход должен быть:

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

Как я могу добиться этого? Существует ли универсальный неязыковый метод (скажем, теперь я хочу отобразить это и отсортировать на другом языке с помощью других правил сортировки).

+1

У вас есть это решение? http://stackoverflow.com/questions/12889760/sort-list-of-strings-with-localization – Abdul

ответ

4

Вы должны пройти Collator методы сортировки: порядок сортировки

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

по умолчанию определяется Unicode кодовых в строке, и это не правильный алфавитный порядок на любом языке.

2

Посмотрите на java.text.Collator.newInstance(Locale). В вашем случае вам необходимо указать местный язык. Collators реализуют интерфейс Comparator, поэтому вы можете использовать его в API сортировки и в сортированных структурах данных, таких как TreeSet.

1

К сожалению, в польском ł приходит после того, как л и до м поэтому выход должен быть:

Вы можете определить свой собственный Compararable или Comparator интерфейс.

Или же это может помочь вам:

6

попробовать

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

он будет производить

... 
litewski 
łotewski 
... 

см Col lator API для деталей

0

Я занимаюсь той же проблемой. Я обнаружил, что локальное решение для коллекционеров отлично работает для android 7.0, но не относится к более ранним версиям Android. Я реализовал следующий алгоритм. Это довольно быстро (я сортирую более 3000 строк) и делает это на ранних версиях 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; 
    } 
} 
Смежные вопросы