2012-10-08 36 views
18

Sắp xếp chuỗi bằng số được thực hiện khác nhau từ ngôn ngữ này sang ngôn ngữ khác. Ví dụ, trong các chữ số tiếng Anh đến trước chữ cái trong một phân loại tăng dần. Nhưng, bằng tiếng Đức, chữ số được tăng lên sau khi sắp xếp chữ cái.Phân loại ngôn ngữ (tiếng Đức) bằng Java

tôi đã cố gắng để sắp xếp chuỗi sử dụng một Collator như sau:

private Collator collator = Collator.getInstance(Locale.GERMANY); 
collator.compare(str1, str2) 

Nhưng trên so sánh không tính đến số tài khoản sau khi quy tắc chữ cái.

Có ai có một ý tưởng tại sao Java không dùng quy tắc này (chữ số sau chữ) vào tài khoản trong thời gian này tôi đang sử dụng RuleBasedCollator như sau:

private final String sortOrder = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R < s, S < t, T < u, U < v, V < w, W < x, X < y, Y < z, Z < 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9"; 

private Collator collator = new RuleBasedCollator(sortOrder); 
+6

Có ý rằng bạn không có umlauts và Sharp-s (äöüß) trong thứ tự sắp xếp của bạn? Tôi muốn nói rằng họ rất quan trọng vì có một nhà sưu tập người Đức. –

+0

có, đối với trường hợp thử nghiệm tôi đã bỏ qua các dấu âm và ký tự đặc biệt. chỉ muốn giữ nó rất đơn giản. – Amir

+4

Ngoài ra: các quy tắc nào bạn thực hiện theo các chữ số sắp xếp đó sau các ký tự khác? Có một số collations khác nhau cho tiếng Đức và ít nhất một số trong những số phân loại đầu tiên. –

Trả lời

13

Bạn có thể kiểm tra/debug mã nguồn để xem tại sao có gì thay đổi:

Collator.getInstance(Locale.GERMANY); 

Calls mã mảnh sau:

public static synchronized 
Collator getInstance(Locale desiredLocale) 
{ 
    // Snipping some code here 
    String colString = ""; 
    try { 
     ResourceBundle resource = LocaleData.getCollationData(desiredLocale); 

     colString = resource.getString("Rule"); 
    } catch (MissingResourceException e) { 
     // Use default values 
    } 
    try 
    { 
     result = new RuleBasedCollator(CollationRules.DEFAULTRULES + 
             colString, 
             CANONICAL_DECOMPOSITION); 
    } 
// Snipping some more code here 

Trên đây bạn có thể thấy rằng các quy tắc cụ thể (colString đó là trống rỗng, trong trường hợp của bạn anyway) được đặt sau giá trị mặc định (CollationRules.DEFAULTRULES).

Và như bạn đã phát hiện ra rằng giá trị mặc định có các numerics đặt đầu tiên:

// NUMERICS 

    + "<0<1<2<3<4<5<6<7<8<9" 
    + "<\u00bc<\u00bd<\u00be" // 1/4,1/2,3/4 fractions 

    // NON-IGNORABLES 
    + "<a,A" 
    + "<b,B" 
    + "<c,C" 
    + "<d,D" 
Các vấn đề liên quan