sorted(by:)
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 30 من 56.
لقد استخدمت .sorted() على مصفوفات من قيم Comparable مثل الأرقام أو النصوص. عندما تريد الفرز حسب شيء آخر، قم بتوفير closure يأخذ عنصرين ويعيد true عندما يجب أن يأتي العنصر الأول قبل الثاني.
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength) // ["hi", "hello", "banana"]للترتيب التنازلي، قم بتبديل المقارنة:
let down = words.sorted { $0.count > $1.count }
print(down) // ["banana", "hello", "hi"]يمكن للإغلاق (closure) مقارنة أي قيمة مشتقة، أو الطول، أو الحرف الأخير، أو إدخال في جدول هاش (hash). أياً كان ما يقارنه الإغلاق، فإنه يحدد الترتيب.
تعمل min(by:) و max(by:) بنفس الطريقة ولكنهما تعيدان عنصراً اختيارياً (optional) واحداً بدلاً من نسخة مرتبة.
التحدي
متوسطاقرأ سطراً واحداً من المدخلات: قائمة مفصولة بفاصلة من أزواج name:age.
اطبع ثلاثة أسطر:
- الأسماء مرتبة حسب العمر تصاعدياً، مدمجة بـ
,. في حال التساوي في العمر، يتم ترتيب الأسماء المتساوية أبجدياً. - اسم الشخص الأكبر سناً (استخدم
max(by:)). في حال التساوي، يفوز الاسم الذي ظهر أولاً. - اسم الشخص الأصغر سناً (استخدم
min(by:)). في حال التساوي، يفوز الاسم الذي ظهر أولاً.
للمدخلات alice:30,bob:22,cara:30,dan:18، تكون المخرجات:
dan,bob,alice,cara
alice
danورقة مرجعية
استخدم .sorted { } مع إغلاق (closure) مخصص للفرز بناءً على أي قيمة مشتقة. يأخذ الإغلاق عنصرين ويعيد true عندما يجب أن يسبق العنصر الأول العنصر الثاني:
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
// ["hi", "hello", "banana"]للترتيب التنازلي، قم بتبديل العامل (operator):
let down = words.sorted { $0.count > $1.count }
// ["banana", "hello", "hi"]تستخدم min(by:) و max(by:) نفس توقيع الإغلاق ولكنها تعيد عنصراً اختيارياً (optional) واحداً:
let longest = words.max(by: { $0.count < $1.count }) // "banana"
let shortest = words.min(by: { $0.count < $1.count }) // "hi"جرّب بنفسك
let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
let parts = pair.components(separatedBy: ":")
return (parts[0], Int(parts[1])!)
}
// مهام: الفرز حسب العمر تصاعدياً (المفاضلة بالاسم عند التساوي)؛ max(by:) للأكبر سناً؛ min(by:) للأصغر سناً
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات