2012-08-10 41 views
7

Tôi có một vấn đề trong việc so sánh strings.I muốn so sánh hai "ed" và "ef" văn bản tiếng Pháp như thế nàyjava CollationKey sắp xếp sai

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("éd"); 
CollationKey b = localeSpecificCollator.getCollationKey("ef"); 
System.out.println(a.compareTo(b)); 

này sẽ in -1, nhưng trong bảng chữ cái tiếng Pháp e đến trước é. Nhưng khi chúng ta so sánh chỉ eé như

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("é"); 
CollationKey b = localeSpecificCollator.getCollationKey("e"); 
System.out.println(a.compareTo(b)); 

kết quả này là 1. Bạn có thể cho chúng tôi biết có gì sai trong phần đầu của mã không?

+1

anh có chữ "cùng vấn đề" (Tôi nghĩ khá chấp nhận được) với ' 'Swing' Comparator' và triển khai nó cho RowSorter'' and' RowFilter' trong' 'JTable' cho Win1250-2' eq. 'ISO 8859-1/2', cho tất cả các phi ASCII đâu xe tăng được sắp xếp trên cuối ví dụ e -> e ei, xin lỗi không bao giờ cần thiết để giải quyết đó, Bởi vì là khá chấp nhận được và đặt logic với – mKorbel

Trả lời

3

Điều này có vẻ là hành vi mong đợi và nó cũng có vẻ là cách chính xác để sắp xếp theo thứ tự bảng chữ cái bằng tiếng Pháp.

Các Android javadoc đưa ra một gợi ý là tại sao nó là hành xử như vậy - Tôi cho rằng các chi tiết của việc thực hiện trong android cũng tương tự, nếu không giống nhau, với các tiêu chuẩn JDK:

Một sự khác biệt đại học được bỏ qua khi có sự khác biệt chính hoặc phụ ở bất kỳ đâu trong chuỗi.

Nói cách khác, vì 2 chuỗi của bạn có thể sắp xếp bằng cách chỉ xem xét sự khác biệt chính (không bao gồm dấu trọng âm), trình thu thập không kiểm tra sự khác biệt khác.

Nó có vẻ là phù hợp với Unicode Collation Algorithm (UCA):

khác biệt Accent thường được bỏ qua, nếu các chữ cái cơ sở khác nhau.

Và nó aussi Có vẻ là cách thích hợp để đánh vần theo thứ tự abc bằng tiếng Pháp, selon các wikipedia article on "ordre alphabetique":

Trong phân tích đầu tiên, ký tự có dấu, cũng như thủ đô, có cấp bậc tương tự thuộc về mẫu tự mà các nhân vật cơ bản
Nếu nhiều lời có cấp bậc tự chữ cái tương tự, chúng tôi cố gắng để phân biệt chúng nhờ vào phía trên và dấu (đối với e là thứ tự đ é, è, e, e)

Trong tiếng Anh: trình tự ban đầu bỏ qua điểm nhấn và trường hợp - nếu hai từ không thể được sắp xếp như vậy, điểm nhấn và trường hợp được đưa vào tài khoản Sau đó.

0

Từ JavaDoc:

Bạn có thể thiết lập thuộc tính sức mạnh của một collator để xác định mức độ của sự khác biệt coi trọng trong so sánh. Bốn điểm mạnh được cung cấp: PRIMARY, SECONDARY, TERTIARY và IDENTICAL. Việc gán chính xác điểm mạnh cho các đối tượng địa lý ngôn ngữ phụ thuộc vào ngôn ngữ. Ví dụ, trong tiếng Séc, "e" và "f" được coi là khác biệt chính, trong khi "e" và "ě" là khác biệt phụ, "e" và "E" là sự khác biệt đại học và "e" và "e" giống hệt nhau .

Hãy thử điểm mạnh khác nhau:

localeSpecificCollator.setStrength(Collator.PRIMARY); 

và xem những gì sẽ xảy ra.

+1

Tôi đã thử tất cả các lợi ích sức mạnh , nhằm mục đích nó đã không giúp – Ashot

+1

@Tichodroma Sự khác biệt thứ cấp/đại học không được đưa vào tính toán nếu có sự khác biệt chính. – assylias

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