فرز سلاسل تحتوي على أرقام بطريقة سهلة الاستعمال

StackOverflow https://stackoverflow.com/questions/1022203

سؤال

ويجري استخدامها لطريقة قياسية لفرز السلاسل، وفوجئت عندما لاحظت أن ويندوز بفرز الملفات بأسمائها في نوع من الطريقة المتقدمة. اسمحوا لي أن أقدم لكم مثالا:

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

وأعتقد أن تتم مقارنة هذه الأسماء (خلال فرز) بناء على الرسائل والأرقام بشكل منفصل.

وعلى صعيد آخر، وفيما يلي لائحة نفس مرتبة بطريقة قياسية:
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3

وأود أن إنشاء alogorithm مقارنة في دلفي التي من شأنها أن اسمحوا لي أن فرز السلاسل في نفس الطريق. في البداية اعتقدت انه سيكون كافيا لمقارنة أحرف متتالية من سلسلتين بينما هم الحروف. متى سيتم العثور على أرقام في بعض موقف كل من السلاسل، وأود أن قراءة كافة الأرقام التالية لهم لتشكيل عدد وثم قارن بين الأرقام.

لأعطيك مثالا، سوف مقارنة "Track10" وسلاسل "Track2" بهذه الطريقة:
1) قراءة الأحرف في حين أنهم متساوون وبينما هم الرسائل: "المسار"، "المسار"
2) إذا تم العثور على أرقام، وقراءة كافة الأرقام التالية: "10"، "2"
2A) إذا كانت تساوي، انتقل إلى 1 وإلا إنهاء
عشرة أكبر من اثنين، وذلك "Track10" أكبر من "Track2"

وبدا أن أن كل شيء على ما يرام حتى أنني لاحظت، خلال بلدي التجارب، أن ويندوز تعتبر "Track010" أقل من "Track10"، في حين اعتقدت أول واحد أكبر كما كان يعد (لم يذكر أنه وفقا ل سيكون لي خوارزمية كل من السلاسل أن يكون على قدم المساواة، وهذا خطأ).

هل يمكن أن تقدم لي مع فكرة بالضبط كيف يفرز ملفات Windows بأسماء أو ربما لديك خوارزمية جاهزة للاستخدام (في أي لغة برمجة) أن أتمكن من قاعدة على؟

وشكرا جزيلا!
ماريوس

هل كانت مفيدة؟

المحلول

وكتب جيف يصل مقالا حول هذا الموضوع على الترميز الرعب. وهذا ما يسمى الطبيعية الفرز ، حيث يمكنك علاج فعال مجموعة الأرقام بأنها "شخصية" واحد. هناك تطبيقات هناك في كل لغة تحت الشمس، ولكن الغريب انها ليست عادة في بناء إلى المكتبات القياسية معظم لغات.

نصائح أخرى

والطريقة المطلقة أسهل، ولقد وجدت، وعزل سلسلة تريد، وذلك في حالة OP، وPath.GetFileNameWithoutExtension ()، وإزالة غير الأرقام، تحويل لكثافة العمليات، والنوع. استخدام LINQ وبعض طرق الإرشاد، انها بطانة واحدة. في حالتي، كنت ذاهبا على الدلائل:

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

وأين RemoveNonDigits وToIntOrZero هي طرق ملحقات:

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

ووطرق الإرشاد والأدوات المشتركة I استخدام في كل مكان. YMMV.

والأم من كل نوع:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top