2011-10-03 9 views
12

मेरे पास यह कोड है। यह फ्रेंच और रूसी में सही ढंग से ठीक है। मैंने Locale.US का उपयोग किया और यह सही लगता है। क्या यह समाधान वहां सभी भाषाओं के साथ सही है? क्या यह अन्य भाषाओं के साथ काम करता है? उदाहरण के लिए: चीनी, कोरियाई, जापानी ... यदि नहीं, तो बेहतर समाधान क्या है?क्या सभी भाषाओं में तारों को सॉर्ट करने का कोई तरीका है?

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); 
     } 
    } 
} 

अद्यतन: क्षमा करें, मैं इस सेट की आवश्यकता नहीं है आदेश में सभी भाषाओं को शामिल होना चाहिए। मेरा मतलब है कि इस सेट में एक भाषा है और हर भाषा में सही ढंग से क्रमबद्ध है।

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

मुझे नहीं लगता कि आप सार्थक अंतर-भाषा शब्द का एक आदेश को परिभाषित कर सकते हैं। – Flexo

+3

भले ही सेट में केवल एक भाषा हो, फिर भी आपको हर बार सॉर्ट करना चाहते समय 'कोलेटर' के लिए सही 'लोकेल' चुनना होगा। –

उत्तर

21

प्रत्येक भाषा के अपने स्वयं के वर्णमाला क्रम के कारण आप नहीं कर सकते हैं। उदाहरण के लिए,

रूसी भाषा जैसा आपने बताया है с पत्र में तुर्की भाषा से अलग आदेश है।

आपको हमेशा कॉललेटर का उपयोग करना चाहिए। मैं सुझाव दे सकता हूं कि आप हमारे लिए संग्रह API है।

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

    // 
    // Sort the list using Collator 
    // 
    Collections.sort(words, collator); 
आगे जानकारी जांच के लिए

और के रूप में कहा गया है here

इस कार्यक्रम से पता चलता है जब आप दो अलग अलग collators साथ शब्दों की एक ही सूची को सॉर्ट हो सकता है:

कोलेटर fr_FRCollator = Collator.getInstance (नई लोकेल ("fr", "fR"));

कॉललेटर en_USCollator = Collator.getInstance (नया लोकेल ("एन", "यूएस"));

सॉर्टिंग्स नामक सॉर्टिंग के लिए विधि को किसी भी कॉललेटर के साथ उपयोग किया जा सकता है।सूचना sortStrings विधि invokes कि तुलना विधि:

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; 
      } 
     } 
     } 
} 

अंग्रेजी कोलेटर सॉर्ट करता शब्द इस प्रकार है:

आड़ू Pêche pêche पाप

फ्रेंच भाषा का मिलान नियमों के अनुसार , पिछली सूची गलत क्रम में है। फ्रांसीसी पेचे में एक क्रमबद्ध सूची में पेचे का पालन करना चाहिए। इस प्रकार फ्रेंच कोलेटर सही ढंग से शब्दों की सरणी सॉर्ट करता,:

आड़ू pêche Pêche पाप

1

जहाँ तक मुझे पता है, चीनी, जापानी संभव हीरागाना या काताकाना में आदेश है उनकी भाषा के लिए किसी भी क्रम की जरूरत नहीं है, लेकिन कांजी में यह संदिग्ध है। लेकिन कंप्यूटरों में सबकुछ संख्याओं द्वारा दर्शाया जाता है जो भाषाओं के लिए समान चीजें गाती है। प्रत्येक चिह्न अद्वितीय यूनिकोड संख्या से मेल खाता है। तो यह आपके लिए समाधान हो सकता है, शब्दों को उनके यूनिकोड पदों का उपयोग करके सॉर्ट करें।

+2

चीनी हांज़ी और जापानी कांजी पात्रों को कट्टरपंथी और स्ट्रोक गिनती द्वारा क्रमबद्ध किया जा सकता है। –

9

भले ही आप भाषा का उपयोग करने के लिए सटीक रूप से पता लगा सकें, उपयोगी कॉलेशन ऑर्डर आमतौर पर किसी विशेष भाषा + देश संयोजन के लिए विशिष्ट होते हैं। और यहां तक ​​कि किसी भाषा + देश के भीतर, उपयोग या कुछ अनुकूलन के आधार पर संयोजन भिन्न हो सकता है।

हालांकि, यदि आपको पाठ के मनमानी सेट को क्रमबद्ध करने की आवश्यकता है, तो आपकी सर्वश्रेष्ठ शर्त Unicode Collation Algorithm है, जो किसी भी यूनिकोड टेक्स्ट के लिए भाषा-स्वतंत्र संयोजन को परिभाषित करती है। एल्गोरिदम अनुकूलन योग्य है, लेकिन आवश्यक नहीं है जो किसी भी संस्कृति को समझ में आता है (और निश्चित रूप से उन दोनों में नहीं)।

जावा के संयोजन वर्ग इस एल्गोरिदम को लागू नहीं करते हैं, लेकिन यह ICU's RuleBaseCollator के हिस्से के रूप में उपलब्ध है।

+1

जावा में आप रूट लोकेल प्राप्त करने के लिए लोकेल ("") का उपयोग करते हैं (जावा 7 में लोकेल.रोओटी स्थिर है)। इस लोकेल के लिए कॉललेटर यूसीए है। –

संबंधित मुद्दे

 संबंधित मुद्दे