2010-09-15 7 views
8

मैंने इस प्रश्न का उत्तर यहां जोड़ा: Sorting List<String> in C# जो एक प्राकृतिक सॉर्ट ऑर्डर की मांग करता है, जो एम्बेड किए गए नंबरों को संभालता है।एक बेहतर प्राकृतिक प्रकार (मेरा से) लिखना

मेरा कार्यान्वयन, हालांकि, निष्पक्ष है, और इस बात के बारे में सभी पदों के बदले में अनुप्रयोगों को यूनिकोड को सही तरीके से कैसे संभाला जाता है (तुर्की परीक्षण किसी को भी?), मैंने सोचा कि मैं मदद लिखने के लिए पूछूंगा बेहतर कार्यान्वयन। या, यदि .NET की अंतर्निहित विधि है, तो कृपया मुझे बताएं :)

उस प्रश्न में उत्तर के लिए मेरा कार्यान्वयन केवल तारों के माध्यम से चरित्र की तुलना में स्ट्रिंग के माध्यम से होता है, जब तक कि यह दोनों में एक अंक न हो। फिर यह दोनों तारों से लगातार अंक निकालता है, जिसके परिणामस्वरूप अलग-अलग लंबाई हो सकती है, अग्रणी शून्यों के साथ सबसे कम पैड, और फिर तुलना की जाती है।

हालांकि, इसके साथ समस्याएं हैं।

उदाहरण के लिए, यदि स्ट्रिंग एक्स में आपको दो कोडपॉइंट्स हैं जो एक साथ चरित्र È बनाते हैं, लेकिन दूसरी स्ट्रिंग में आपके पास केवल एक कोडपॉइंट है, वह वह चरित्र है।

मेरा एल्गोरिदम उन पर असफल होगा, क्योंकि यह एक वर्ण के रूप में डायक्रिटिक कोडपॉइंट का इलाज करेगा, और इसकी तुलना दूसरे स्ट्रिंग से È से करेंगी।

क्या कोई मुझे इस तरीके से ठीक तरीके से संभालने की दिशा में मार्गदर्शन कर सकता है? मैं जर्मनी की समस्याओं को संभालने के लिए CultureInfo ऑब्जेक्ट निर्दिष्ट करने के लिए समर्थन चाहता हूं, जैसे जर्मनी में "एसएस" के साथ "एसएस" की तुलना करना, और इसी तरह की चीजें।

मुझे लगता है कि मुझे अलग-अलग कोडपॉइंट्स के बजाय "असली अक्षर" (मुझे वास्तविक शब्द नहीं पता) पर गिनने के लिए अपना कोड प्राप्त करने की आवश्यकता है।

इसका सही दृष्टिकोण क्या है? दिनांक और समय के बारे में क्या

  • :

    इसके अलावा, अगर "प्राकृतिक" का अर्थ है "जिस तरह से मनुष्य यह काम करने की उम्मीद", मैं निम्नलिखित बातें विचार करने के लिए जोड़ होगा?

  • फ़्लोटिंग पॉइंट मानों के बारे में क्या?
  • क्या ऐसे अन्य अनुक्रम हैं जिन्हें "प्राकृतिक" माना जाता है?
    • इसे कितना दूर किया जाना चाहिए? (Eeny, meeny, miny, मो)

उत्तर

7

यह विंडोज़ में पहले से ही उपलब्ध है, एक्सप्लोरर विंडो में फ़ाइलों की व्यवस्था करते समय खोल प्राकृतिक प्रकार के क्रम का उपयोग करता है। इसका उपयोग करने वाला तुलना फ़ंक्शन निर्यात किया जाता है और कम से कम विंडोज 2000 के बाद से किसी भी प्रोग्राम के लिए उपलब्ध होता है। जबकि पी/Invoke सबसे बड़ा समाधान नहीं है, लेकिन पिछले 10 वर्षों में अरबों बार परीक्षण किए जाने का काफी लाभ होता है। और तारों को इस तरह से सॉर्ट करना कि उपयोगकर्ता पहले से ही परिचित है।

डायरेक्ट्रीज़ हैंडलिंग पहले से ही .NET का हिस्सा है, स्ट्रिंग। Normalize() विधि इसका ख्याल रखती है।

यहां एक नमूना कार्यक्रम यह का उपयोग करता है है, यह ठीक से तारों के रूप में वास्तविक थ्रेड में अनुरोध सॉर्ट करता:

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 

class Program { 
    static void Main(string[] args) { 
     string[] arr = new string[] { "1", "5", "3", "6", "11", "9", "NUM1", "NUM0" }; 
     Array.Sort(arr, new LogicalComparer()); 
     foreach (string s in arr) Console.WriteLine(s); 
     Console.ReadLine(); 
    } 
} 
class LogicalComparer : IComparer<string> { 
    public int Compare(string x, string y) { 
     return StrCmpLogicalW(x.Normalize(), y.Normalize()); 
    } 
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
    private static extern int StrCmpLogicalW(string s1, string s2); 
} 
+0

हाय हंस ... एक बार फिर हमेशा के रूप में ... कमाल का जवाब ... बस उत्सुक ... आप को पीएल के बारे में कैसे पता चला/इन में शामिल हो गए ?? – Dinesh

+1

यह नीचे के कार्य के लिए एमएसडीएन आलेख में दस्तावेज है। –

+0

इसे मिला ... धन्यवाद – Dinesh

2

मैं नेट बारे में ज्यादा पता नहीं है, लेकिन यह भी एक एल्गोरिथम सवाल है के बाद से, यहाँ मेरी दो सेंट हैं:

मैं कोशिश करता हूँ स्ट्रिंग को टोकन में विभाजित करने के लिए, शायद नियमित अभिव्यक्तियों का उपयोग करना। फिर आप टोकन के प्रकार के आधार पर उपयुक्त तुलना फ़ंक्शन का उपयोग करके टोकन द्वारा स्ट्रिंग टोकन की तुलना कर सकते हैं।

अधिक विशेष रूप से:

  1. दिनांक, संख्या, शब्दों के लिए नियमित अभिव्यक्ति को परिभाषित करें, ... उन के अंतिम फ़ॉलबैक अभिव्यक्ति है जो किसी भी अक्षर से मेल खाता होना चाहिए।
  2. प्रत्येक अभिव्यक्ति का प्रयास करें, सबसे विशिष्ट पहले, जब तक कि दोनों स्ट्रिंग्स
  3. की शुरुआत में एक मैच से मेल खाता है, जो उस भाग को निकालें जो उपयुक्त तुलना फ़ंक्शन का उपयोग करके मेल खाता है और इसकी तुलना करें।
  4. समानता के मामले में, दोनों तार की शुरुआत से मैच को हटाने और कदम 2.

से दोहराने नियमित अभिव्यक्ति का उपयोग करना, यह भी यूनिकोड समर्थन करने के लिए संभव हो जाना चाहिए, यदि आप [a-zA-Z] लेकिन उचित उपयोग नहीं करते चरित्र वर्ग जैसे [:alpha:]

È के विभिन्न रूपों की तुलना के लिए, आप पहले स्ट्रिंग normalize करने का प्रयास कर सकते हैं।

+0

है यही कारण है कि मैं एक ही सवाल पर किया था: http://stackoverflow.com/questions/3716831/सॉर्टिंग-लिस्टस्ट्रिंग-इन-सी/3717211 # 3717211। मेरी राय में, यह एक अच्छा अलगाव देता है - सबसे पहले आप टोकन के विभिन्न हिस्सों को समझते हैं, और बाद में उन्हें क्रमबद्ध करते हैं। – Kobi

+0

धन्यवाद ... मुझे पोस्ट करने से पहले वहां देखना चाहिए था! –

+0

आपको वास्तव में नहीं होना चाहिए! ':)' – Kobi

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