2013-03-20 40 views
5

Tôi muốn in các tên Ba Lan được sắp xếp của tất cả các ngôn ngữ có sẵn.Sắp xếp chuỗi ký tự không phải là phương Tây

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

Thật không may tôi có vấn đề với phần sắp xếp. Đầu ra là:

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

Đáng tiếc là ở Ba Lan ł đưa ra sau khi l và trước m nên sản lượng nên là:

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

Làm thế nào tôi có thể thực hiện điều đó? Có phương pháp không phụ thuộc vào ngôn ngữ không phổ biến (nói bây giờ tôi muốn hiển thị phương thức này và sắp xếp theo ngôn ngữ khác với các quy tắc sắp xếp khác).

+1

bạn đã kiểm tra giải pháp này chưa? http://stackoverflow.com/questions/12889760/sort-list-of-strings-with-localization – Abdul

Trả lời

4

Bạn nên vượt qua một collator đến cách sắp xếp: thứ tự sắp xếp

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

Giá trị mặc định được xác định bởi codepoints Unicode trong chuỗi, và đó không phải là thứ tự chữ cái đúng trong bất kỳ ngôn ngữ.

2

Hãy xem java.text.Collator.newInstance(Locale). Bạn cần cung cấp ngôn ngữ Ba Lan trong trường hợp của bạn. Các trình thu thập thực hiện giao diện Comparator, vì vậy bạn có thể sử dụng giao diện đó trong các API sắp xếp và trong các cấu trúc được sắp xếp như TreeSet.

6

thử

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

nó sẽ sản xuất

... 
litewski 
łotewski 
... 

thấy Col API lator để biết chi tiết

0

Tôi đang xử lý cùng một vấn đề. Tôi thấy rằng giải pháp thu cục bộ hoạt động tốt cho android 7.0, nhưng không hoạt động trên các phiên bản Android cũ hơn. Tôi đã triển khai thuật toán sau. Nó là khá nhanh (tôi sắp xếp hơn 3000 dây) và hiện nó trên phiên bản Android trước đó quá.

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; 
    } 
} 
Các vấn đề liên quan