"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية فرز المصفوفات باستخدام سلاسل تحتوي على أرقام بالترتيب الطبيعي؟

كيفية فرز المصفوفات باستخدام سلاسل تحتوي على أرقام بالترتيب الطبيعي؟

تم النشر بتاريخ 2024-12-23
تصفح:421

How to Sort Arrays with Strings Containing Numbers in Natural Order?

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

تتعمق هذه المقالة في مهمة فرز المصفوفات التي تحتوي على عناصر تجمع بين السلاسل والأرقام في الترتيب الطبيعي، حيث يجب مراعاة التسلسل الرقمي داخل السلاسل في عملية الفرز.

إن مشكلة

فكر في مصفوفة مثل هذا:

["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]

إذا حاولنا فرز هذه المصفوفة باستخدام دالة فرز تقليدية، فقد ينتهي بنا الأمر إلى ترتيب غير صحيح:

["IL0 Foo", "IL10 Baz", "IL3 Bob says hello", "PI0 Bar"]

الحل: الفرز الطبيعي

لتحقيق الفرز الطبيعي، يمكننا الاستفادة من وظيفة JavaScript التالية:

الوظيفة الطبيعية مقارنة ( أ، ب) { فار الفأس = []، bx = []؛ a.replace(/(\d )|(\D )/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) }); b.replace(/(\d )|(\D )/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) }); بينما (ax.length && bx.length) { var an = ax.shift(); var bn = bx.shift(); var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]); إذا (ن) العودة ن؛ } إرجاع طول الفأس - طول bx؛
function naturalCompare(a, b) {
    var ax = [], bx = [];

    a.replace(/(\d )|(\D )/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
    b.replace(/(\d )|(\D )/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
    
    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }

    return ax.length - bx.length;
}
تقوم هذه الوظيفة بترميز سلاسل الإدخال إلى صفائف ذات قيم رقمية وغير رقمية. ثم يقوم بمقارنة المصفوفات معجميا، مع الأخذ في الاعتبار القيم الرقمية كأعداد صحيحة والقيم غير الرقمية كسلاسل.

مثال

تطبيق هذه الدالة على المصفوفة المحددة النتائج في ترتيب الفرز الطبيعي المطلوب:

test = [ "img12.png"، "img10.png"، "img2.png"، "img1.png"، "img101.png"، "img101a.png"، "abc10.jpg"، "اي بي سي 10"، "abc2.jpg"، "20.jpg"، "20"، "اي بي سي"، "اي بي سي 2"، "" ]; اختبار الفرز(المقارنة الطبيعية) document.write("
" JSON.stringify(test,0,3));
test = [
    "img12.png",
    "img10.png",
    "img2.png",
    "img1.png",
    "img101.png",
    "img101a.png",
    "abc10.jpg",
    "abc10",
    "abc2.jpg",
    "20.jpg",
    "20",
    "abc",
    "abc2",
    ""
];

test.sort(naturalCompare)
document.write("<pre>"   JSON.stringify(test,0,3));
ينتج عن ذلك المصفوفة المرتبة التالية:

[ ""، "اي بي سي"، "اي بي سي 2"، "اي بي سي 10"، "abc10.jpg"، "20"، "20.jpg"، "img1.png"، "img2.png"، "img10.png"، "img12.png"، "img101.png"، "img101a.png" ]
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3