2012-08-10 9 views
7

मैं strings.I की तुलना में एक समस्या यहजावा CollationKey छँटाई गलत

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

इस तरह दो "एड" और "एफई" फ्रेंच ग्रंथों की तुलना करना चाहते -1 प्रिंट होगा है, लेकिन फ्रेंच वर्णमाला में e पहले आते हैं é। लेकिन जब हम इस

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

परिणाम केवल e और é तुलना 1 है। क्या आप हमें बता सकते हैं कि कोड के पहले भाग में क्या गलत है?

+1

मैं के साथ "एक ही मुद्दा" (मैं बहुत स्वीकार्य लगता है) है '' Swing' Comparator' और '' Win1250-2' के लिए JTable' eq में RowSorter' 'and' RowFilter' के लिए इसके कार्यान्वयन। 'आईएसओ 8859-1/2', सभी गैर- ASCII कहाँ टैंकों के लिए उदाहरण ई अंत पर क्रमबद्ध किया जाता के लिए -> ई Ei, खेद की जरूरत कभी नहीं हल करने के लिए मैं सारी शक्ति लाभ की कोशिश की है क्योंकि बहुत स्वीकार्य है और – mKorbel

उत्तर

3

यह अपेक्षित व्यवहार प्रतीत होता है और यह फ्रेंच में वर्णानुक्रम में क्रमबद्ध करने का सही तरीका भी प्रतीत होता है।

Android javadoc कारण है कि यह उस तरह व्यवहार कर रहा है के रूप में एक संकेत देता है - मैं एंड्रॉयड में कार्यान्वयन के विवरण लगता मानक JDK के लिए, इसी तरह, अगर नहीं समान हैं:

एक तृतीयक अंतर स्ट्रिंग में कहीं भी प्राथमिक या माध्यमिक अंतर होने पर अनदेखा किया जाता है।

दूसरे शब्दों में, क्योंकि आपके 2 तार केवल प्राथमिक मतभेदों (उच्चारण को छोड़कर) को क्रमबद्ध करके क्रमबद्ध होते हैं, कोलेटर अन्य मतभेदों की जांच नहीं करता है।

ऐसा लगता है Unicode Collation Algorithm (UCA) साथ संगत करने के लिए किया जा:

एक्सेंट मतभेद आम तौर पर अनदेखी कर रहे हैं, अगर आधार पत्र भिन्न होते हैं।

और यह aussi फ्रेंच में वर्णानुक्रम वर्तनी उचित तरीके से होना करने के लिए लगता है, selon wikipedia article on "ordre alphabetique":

पहले विश्लेषण में, उच्चारण वर्ण, साथ ही राजधानी, एक ही रैंक है वर्णक्रमानुसार कि मौलिक चरित्र
कई शब्दों के एक ही वर्णमाला रैंक है, तो हम उन्हें ऊपरी और लहजे के लिए धन्यवाद भेद करने की कोशिश (ई के लिए आदेश ई था, ई, ई, ई, ई)

अंग्रेजी में: आदेश शुरूआती लहजे और मामले को अनदेखा करें - दो शब्दों का हल नहीं किया जा सकता है, तो वे, लहजे और मामले तो ध्यान में रखा जाता है।

0

JavaDoc से:

आप तुलना में महत्वपूर्ण माना अंतर के स्तर को निर्धारित करने के लिए एक कोलेटर की ताकत गुण सेट कर सकते हैं। चार शक्तियां प्रदान की जाती हैं: प्राथमिक, माध्यमिक, प्रारंभिक, और पहचान पत्र। भाषा सुविधाओं के लिए ताकत का सटीक असाइनमेंट लोकेल निर्भर है। उदाहरण के लिए, चेक में, "ई" और "एफ" को प्राथमिक मतभेद माना जाता है, जबकि "ई" और "ě" द्वितीयक मतभेद हैं, "ई" और "ई" तृतीयक मतभेद हैं और "ई" और "ई" समान हैं ।

विभिन्न क्षमता आजमाएं:

localeSpecificCollator.setStrength(Collator.PRIMARY); 

और देखो क्या होता।

+1

साथ तार्किक आदेश है, यही कारण है कि , उद्देश्य यह मदद नहीं था – Ashot

+1

@Tichodroma अगर वहाँ प्राथमिक मतभेद हैं माध्यमिक/तृतीयक मतभेद को ध्यान में रखा नहीं कर रहे हैं। – assylias