2011-10-03 37 views
12

Tôi có mã này. Nó sắp xếp chính xác bằng tiếng Pháp và tiếng Nga. Tôi đã sử dụng Locale.US và nó có vẻ đúng. Giải pháp này có phù hợp với tất cả các ngôn ngữ không? Nó có hoạt động với các ngôn ngữ khác không? Ví dụ: Trung Quốc, Hàn Quốc, Nhật Bản ... Nếu không, giải pháp tốt hơn là gì?Có cách nào để sắp xếp chuỗi bằng tất cả các ngôn ngữ không?

public class CollationTest { 
    public static void main(final String[] args) { 
     final Collator collator = Collator.getInstance(Locale.US); 
     final SortedSet<String> set = new TreeSet<String>(collator); 

     set.add("abîmer"); 
     set.add("abîmé"); 
     set.add("aberrer"); 
     set.add("abhorrer"); 
     set.add("aberrance"); 
     set.add("abécédaire"); 
     set.add("abducteur"); 
     set.add("abdomen"); 

     set.add("государственно-монополистический"); 
     set.add("гостить"); 
     set.add("гостевой"); 
     set.add("гостеприимный"); 
     set.add("госпожа"); 
     set.add("госплан"); 
     set.add("господи"); 
     set.add("господа"); 

     for(final String s : set) { 
      System.out.println(s); 
     } 
    } 
} 

Cập nhật: Xin lỗi, tôi không yêu cầu thiết lập này phải có đầy đủ ngôn ngữ theo thứ tự. Ý tôi là tập hợp này chứa một ngôn ngữ và sắp xếp chính xác ở mọi ngôn ngữ.

public class CollationTest { 
    public static void main(final String[] args) { 
     final Collator collator = Collator.getInstance(Locale.US); 
     final SortedSet<String> set = new TreeSet<String>(collator); 

     // Sorting in French. 
     set.clear(); 
     set.add("abîmer"); 
     set.add("abîmé"); 
     set.add("aberrer"); 
     set.add("abhorrer"); 
     set.add("aberrance"); 
     set.add("abécédaire"); 
     set.add("abducteur"); 
     set.add("abdomen"); 
     for(final String s : set) { 
      System.out.println(s); 
     } 

     // Sorting in Russian. 
     set.clear(); 
     set.add("государственно-монополистический"); 
     set.add("гостить"); 
     set.add("гостевой"); 
     set.add("гостеприимный"); 
     set.add("госпожа"); 
     set.add("госплан"); 
     set.add("господи"); 
     set.add("господа"); 
     for(final String s : set) { 
      System.out.println(s); 
     } 
    } 
} 
+4

Tôi không nghĩ rằng bạn có ý nghĩa có thể xác định một trật tự các từ liên kết ngôn ngữ. – Flexo

+3

Ngay cả khi tập hợp chỉ chứa một ngôn ngữ, bạn vẫn sẽ cần phải chọn đúng 'Locale' cho' Collator' mỗi lần bạn muốn sắp xếp. –

Trả lời

21

Vì mỗi ngôn ngữ đều có thứ tự chữ cái riêng của mình, bạn không thể. Ví dụ:

Ngôn ngữ tiếng Nga như bạn đã nêu có с chữ cái có thứ tự khác với ngôn ngữ Thổ Nhĩ Kỳ.

Bạn nên luôn sử dụng trình thu thập. Những gì tôi có thể đề nghị bạn là cho chúng tôi API thu thập.

// 
    // Define a collator for German language 
    // 
    Collator collator = Collator.getInstance(Locale.GERMAN); 

    // 
    // Sort the list using Collator 
    // 
    Collections.sort(words, collator); 

Đối với séc biết thêm thông tin và như đã nêu here

Chương trình này cho thấy những gì có thể xảy ra khi bạn sắp xếp cùng một danh sách các từ với hai collators khác nhau:

collator fr_FRCollator = Collator.getInstance (mới Locale ("fr", "FR"));

Collator en_USCollator = Collator.getInstance (ngôn ngữ mới ("en", "US"));

Phương pháp sắp xếp, được gọi là sortStrings, có thể được sử dụng với bất kỳ Trình thu thập nào.Chú ý rằng phương pháp sortStrings gọi phương pháp so sánh:

public static void sortStrings(Collator collator, 
          String[] words) { 
    String tmp; 
    for (int i = 0; i < words.length; i++) { 
     for (int j = i + 1; j < words.length; j++) { 
      if (collator.compare(words[i], words[j]) > 0) { 
       tmp = words[i]; 
       words[i] = words[j]; 
       words[j] = tmp; 
      } 
     } 
     } 
} 

Người Anh collator sắp xếp các từ ngữ như sau:

đào Peche Peche tội

Theo các quy tắc đối chiếu của ngôn ngữ Pháp , danh sách trước bị sai trật tự. Trong tiếng Pháp péché nên theo pêche trong một danh sách được sắp xếp. Các collator Pháp sắp xếp các mảng của từ một cách chính xác, như sau:

đào Peche Peche tội

1

Theo tôi biết, người Trung Quốc không có bất kỳ thứ tự ngôn ngữ nào, người Nhật có thể có thứ tự trong Hiragana hoặc Katakana, nhưng ở Kanji thì nghi ngờ. Nhưng trong máy tính, tất cả mọi thứ đều được thể hiện bằng những con số tương tự với ngôn ngữ. Mỗi dấu hiệu tương ứng với số UNICODE duy nhất. Vì vậy, đây có thể là giải pháp cho bạn, sắp xếp các từ bằng cách sử dụng vị trí UNICODE của chúng.

+2

Các ký tự kanji của Trung Quốc và Nhật Bản có thể được sắp xếp theo cấp độ và đột quỵ. –

9

Ngay cả khi bạn có thể phát hiện chính xác ngôn ngữ đang được sử dụng, các đơn đặt hàng collation hữu ích thường dành riêng cho một kết hợp ngôn ngữ + quốc gia cụ thể. Và ngay cả trong một ngôn ngữ + quốc gia, đối chiếu có thể khác nhau tùy thuộc vào cách sử dụng hoặc tùy chỉnh nhất định.

Tuy nhiên, nếu bạn cần sắp xếp các tập hợp văn bản tùy ý, đặt cược tốt nhất của bạn là Unicode Collation Algorithm, xác định đối chiếu không phụ thuộc vào ngôn ngữ cho bất kỳ văn bản Unicode nào. Thuật toán có thể tùy chỉnh, nhưng không cần thiết cho kết quả có ý nghĩa đối với bất kỳ nền văn hóa nào (và chắc chắn không phải trên chúng).

Các lớp đối chiếu của Java không triển khai thuật toán này, nhưng nó có sẵn như là một phần của ICU's RuleBaseCollator.

+1

Trong java bạn sử dụng Locale ("") để lấy ngôn ngữ gốc (trong Java 7 có một hằng số Locale.ROOT). Collator cho miền địa phương này là UCA. –

Các vấn đề liên quan