2009-06-20 23 views
14

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

Track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3

मुझे लगता है कि उन नामों तुलना की जाती है लगता है (छँटाई के दौरान) पत्र पर और द्वारा आधारित: मैं आपको एक उदाहरण देता हूँ संख्या अलग से।
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3

मैं करना चाहते हैं:

दूसरी ओर, निम्नलिखित एक ही सूची एक मानक तरीके से हल कर है डेल्फी में एक तुलनात्मक अलोगोरिदम बनाएं जो मुझे तारों को उसी तरह क्रमबद्ध करने दे। पहले मैंने सोचा था कि पत्र होने पर दो तारों के लगातार वर्णों की तुलना करना पर्याप्त होगा। जब दोनों अंकों की स्थिति में एक अंक मिलेगा, तो मैं संख्या बनाने के लिए उनके बाद सभी अंकों को पढ़ूंगा और फिर संख्याओं की तुलना करूंगा।

आपको एक उदाहरण देता करने के लिए, मैं तुलना करेंगे "Track10" और "Track2" तार इस तरह से: "ट्रैक", "ट्रैक"
:
1) वर्णों को पढ़ने, जबकि वे बराबर हैं और जब तक वे पत्र हैं "10", "2"
2a) यदि वे बराबर हैं, 1 करने के लिए जाना वरना खत्म
दस दो से अधिक है, तो "Track10" से अधिक है: 2) अगर एक अंकों पाया जाता है, सभी निम्नलिखित अंक पढ़ "ट्रैक 2"

ऐसा लगता था कि मेरे परीक्षणों के दौरान, जब तक मैंने "ट्रैक 10" से कम "ट्रैक 2010" को नहीं देखा, तब तक सब कुछ ठीक रहेगा, जबकि मैंने सोचा था कि पहला वाला जी था पुनरावर्तक के रूप में लंबे समय तक (उल्लेख नहीं है कि मेरे एल्गोरिदम के अनुसार दोनों तार बराबर होंगे, जो गलत है)।

तुम मुझे विचार कैसे वास्तव में विंडोज नामों से फ़ाइलें सॉर्ट करता या हो सकता है आप एक के लिए तैयार के लिए उपयोग एल्गोरिथ्म (किसी भी प्रोग्रामिंग भाषा में) है कि मैं पर आधार हो सकता है के साथ प्रदान कर सकते हैं?

बहुत बहुत धन्यवाद!
मारियस

+1

कई अन्य प्रश्नों के डुप्ले सहित: http://stackoverflow.com/questions/34518/natural-sorting-algorithm –

+2

क्षमा करें, लेकिन मुझे यह भी नहीं पता था कि पहले कौन सा वाक्यांश खोजना है। यही कारण है कि मैंने अनजाने में इस सवाल को दोहराया। अब मुझे पता है कि सॉर्टिंग के इस तरीके को 'प्राकृतिक सॉर्टिंग' कहा जाता है, इसलिए मैं इसके बारे में कुछ और जानकारी खोज सकता हूं। –

+0

इसे देखें http://stackoverflow.com/questions/31538293/sorting-listfileinfo-in-natural-sorted-order –

उत्तर

17

जेफ ने कोडिंग डरावनी पर इसके बारे में एक लेख लिखा। यह natural sorting है, जहां आप प्रभावी रूप से एक भी "चरित्र" के रूप में अंकों के एक समूह का इलाज कहा जाता है। वहाँ कार्यान्वयन खेले जाने वाले हर भाषा में वहाँ बाहर हैं, लेकिन अजीब यह आम तौर पर निर्मित सबसे अधिक भाषाओं 'मानक पुस्तकालयों के लिए नहीं है।

+4

धन्यवाद सुराग के लिए। मैं एक विंडोज एपीआई फ़ंक्शन StrCmpLogicalW (http://msdn.microsoft.com/en-us/library/bb759947.aspx) ढूंढने में कामयाब रहा, जो मैं ढूंढ रहा था। –

+0

यहां PHP का कार्यान्वयन है: [natsort] (http://php.net/manual/en/function.natsort.php) –

0

सभी प्रकार की माँ:

ls '*.mp3' | sort --version-sort

1

निरपेक्ष सबसे आसान तरीका है, मैंने पाया, स्ट्रिंग आप चाहते हैं अलग था, इसलिए ओपी के मामले में, Path.GetFileNameWithoutExtension(), गैर-अंक हटाएं, int में परिवर्तित करें, और क्रमबद्ध करें। LINQ और कुछ एक्सटेंशन विधियों का उपयोग करके, यह एक-लाइनर है।मेरे मामले में, मैं निर्देशिका पर जा रहा था:

public static string RemoveNonDigits(this string value) { 
    return Regex.Replace(value, "[^0-9]", string.Empty); 
} 

public static int ToIntOrZero(this string toConvert) { 
    try { 
     if (toConvert == null || toConvert.Trim() == string.Empty) return 0;    
     return int.Parse(toConvert); 
    } catch (Exception) { 
     return 0; 
    } 
} 

विस्तार तरीकों आम उपकरणों मैं हर जगह का उपयोग कर रहे हैं:

Directory.GetDirectories(@"a:\b\c").OrderBy(x => x.RemoveNonDigits().ToIntOrZero()) 

RemoveNonDigits और ToIntOrZero कहाँ एक्सटेंशन तरीके हैं। YMMV।

+0

बहुत अच्छा कामकाज। मेरे लिए काम किया! धन्यवाद! – Pedro77

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