2015-11-12 6 views
12

का उपयोग कर कोलेटर के साथ गलत सॉर्टिंग। मैं Locale.SIMPLIFIED_CHINESE का उपयोग कर चीनी में देशों की एक सूची ऑर्डर करने का प्रयास कर रहा हूं, ऐसा लगता है कि यह पिनयिन (फोनेटिक वर्णमाला का उपयोग करने का आदेश देता है, जो अक्षरों को उनके लैटिन संवाददाता संयोजन के अनुसार आदेश दिया जाता है , ए से ज़ेड तक)।Locale.SIMPLIFIED_CHINESE

लेकिन खराब होने पर मुझे कुछ मामलों में मिला है। उदाहरण के लिए:

  • '中' चरित्र zhong1
  • '梵' चरित्र fan4

है सही क्रम 梵 होना चाहिए < 中, लेकिन इसके बजाय यह अन्य तरीके से आदेश दिया जाता है। इस स्निपेट के

String[] characters = new String[] {"梵", "中"}; 
List<String> list = Arrays.asList(characters); 
System.out.println("Before sorting..."); 
System.out.println(list.toString()); 

Collator collator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE); 
collator.setStrength(Collator.PRIMARY); 
Collections.sort(list, collator); 

System.out.println("After sorting..."); 
System.out.println(list.toString()); 

परिणाम हैं:

Before sorting... 
[梵, 中] 
After sorting... 
[中, 梵] 

गहरी जा रहे हैं, मुझे लगता है कि जावा Locale.SIMPLIFIED_CHINESE साथ लागू होता है नियम नहीं मिले। आप अगले छवि में पा सकते हैं: http://postimg.org/image/4t915a7gp/full/ (ध्यान 中 के बाद यह है कि 梵)

मैंने पहले < 口 < 口 < 口 < 口 < 口 कि मैं लाल रंग में हाइलाइट एहसास हुआ, सभी पात्रों को उनके लैटिन संवाददाता के अनुसार आदेश दिया जाता है संयोजन, ए से ज़ेड तक। हालांकि, < 口 < 口 < 口 < 口 < 口 संकेत, वर्णों की रचना द्वारा वर्णों का आदेश दिया जाता है। उदाहरण के लिए, यदि सभी पात्रों का एक ही भाग (आमतौर पर चरित्र का बायां हिस्सा) होता है, तो उन्हें ए से ज़ेड नियम के अनुसार नहीं समझा जाता है।

इसके अलावा, सभी पात्रों < 口 < 口 < 口 < 口 < के बाद 口 कम आम चीनी अक्षरों कर रहे हैं। तो, 梵 中 से कम आम चरित्र है, इसलिए इसे < 口 < 口 < 口 < 口 < 口 के बाद रखा गया है।

मुझे आश्चर्य है कि यह निर्णय जानबूझकर क्यों है। लेकिन इसके परिणामस्वरूप गलत सॉर्टिंग होती है। मुझे नहीं पता कि इसके लिए समाधान कैसे ढूंढें।

धन्यवाद आपके समय के लिए बहुत कुछ!

+0

आप icu4j का उपयोग कर की कोशिश की? – fge

+0

मैंने pinyin4j की कोशिश की है, और उनका ऑर्डर अच्छा है। icu4j अभी तक कोशिश नहीं है। लेकिन मेरा सवाल यह है कि ओरेकल उन नियमों के साथ क्यों क्रमबद्ध है, शायद यह रिपोर्ट करने के लिए एक बग है, या शायद पिनइन सम्मेलनों के साथ जावा एपीआई का उपयोग करने का एक और तरीका है। मेरी कंपनी में व्यवहार्यता के कारण नई पुस्तकालयों को जोड़ना मुश्किल है। आपके समर्थन के लिए धन्यवाद! – elegarpes

उत्तर

2

जावा में कोलेटर द्वारा प्रदान किया गया सॉर्टिंग ऑर्डर उस चरित्र को लिखने के लिए आवश्यक स्ट्रोक पर आधारित है।

प्रदर्शित करने के लिए छोटे स्निपेट के नीचे देखें। स्ट्रोक संख्या से Wikitionary

// the unicode character and the number of strokes 
String[] characters = new String[]{ 
    "\u68B5 (11)", "\u4E2D (4)", 
    "\u5207 (4)", "\u5973 (3)", "\u898B (7)" 
}; 
List<String> list = Arrays.asList(characters); 
System.out.println("Before sorting..."); 
System.out.println(list.toString()); 

Collator collator = Collator.getInstance(Locale.TRADITIONAL_CHINESE); 
collator.setStrength(Collator.PRIMARY); 
System.out.println(); 
Collections.sort(list, collator); 

System.out.println("After sorting..."); 
System.out.println(list.toString()); 

उत्पादन

Before sorting... 
[梵 (11), 中 (4), 切 (4), 女 (3), 見 (7)] 

After sorting... 
[女 (3), 中 (4), 切 (4), 見 (7), 梵 (11)] 

वहाँ एक वृद्धि अनुरोध JDK-6415666 यूनिकोड मिलान आदेश अनुसार छँटाई आदेश लागू करने के लिए है लिया। लेकिन Java 8 supported locale के बारे में जानकारी के बाद यह जावा 8 में लागू नहीं किया गया है।

संपादित छँटाई आदेश icu4j से कोलेटर का उपयोग कर

[梵 (11), 見 (7), 女 (3), 切 (4), 中 (4)] 

है ICU4J कोड स्निपेट

import com.ibm.icu.text.Collator; 
import com.ibm.icu.text.RuleBasedCollator 
... 
Locale locale = new Locale("zh", "", "PINYIN"); 
Collator collator = (RuleBasedCollator) Collator.getInstance(locale);