Menu
CoddyTech
flag Ar iconالعربيةdown icon

الترتيب المخصص

جزء من قسم المنطق وتدفّق التنفيذ في رحلة GDScript على Coddy. الدرس 51 من 78.

ترتّب sort() المصفوفة تصاعديًا وتغيّر المصفوفة نفسها. تنتقل الأعداد من الأصغر إلى الأكبر، وتتبع السلاسل الترتيب نفسه المتّبع في min()، حيث تأتي الأحرف الكبيرة أولًا. ثم تعطي reverse() ترتيبًا تنازليًا:

var scores := [40, 95, 12, 70]
scores.sort()
print(scores) # [12, 40, 70, 95]
scores.reverse()
print(scores) # [95, 70, 40, 12]

لأي ترتيب آخر، استدعِ sort_custom() باستخدام دالة مقارنة. تتلقى عنصرين، a وb، وتُرجع true عندما يجب أن يأتي a قبل b. مرّر الدالة باستخدام اسمها، دون أقواس:

func by_length(a: String, b: String) -> bool:
	return a.length() < b.length()

func _ready():
	var words := ["banana", "fig", "kiwi"]
	words.sort_custom(by_length)
	print(words) # ["fig", "kiwi", "banana"]

يمكن للمقارنة أن تنظر داخل العناصر. هذا المثال يضع القاموس الذي يحتوي على أكبر قيمة "hp" أولًا:

func by_hp(a: Dictionary, b: Dictionary) -> bool:
	return a["hp"] > b["hp"]

الفرز غير مستقر: قد ينتهي الأمر بالعناصر التي تُقارَن على أنها متساوية بأي ترتيب. عندما يكون ترتيب العناصر المتساوية مهمًا، قارِن حقلًا ثانيًا عندما يكون الحقل الأول متساويًا:

func by_score_then_name(a: Dictionary, b: Dictionary) -> bool:
	if a["score"] != b["score"]:
		return a["score"] > b["score"]
	return a["player"] < b["player"]

توجد الدالة sort_custom() في Array، لكن ليس في PackedStringArray الذي تُعيده split()، لذا حوّله أولًا باستخدام Array(...). وستصادف أيضًا المقارنة المكتوبة مباشرةً، كما في sort_custom(func(a, b): return a > b). هذا الشكل هو دالة لامدا، وستتناولها في فصل الدوال المتقدمة.

challenge icon

التحدي

سهل

يقرأ البرنامج سطرين: أعدادًا صحيحة مفصولة بمسافات، وكلمات مفصولة بمسافات. يخزّنها الكود المعطى في numbers (مصفوفة من الأعداد الصحيحة) وwords (مصفوفة من السلاسل النصية).

  1. اكتب دالة مقارنة by_length(a: String, b: String) -> bool في المستوى الأعلى. تأتي الكلمة الأقصر أولًا، وتُرتَّب الكلمات ذات الطول نفسه أبجديًا.
  2. اطبع أربعة أسطر: الأعداد بترتيب تصاعدي، والأعداد بترتيب تنازلي، والكلمات بترتيب أبجدي (باستخدام sort())، والكلمات مرتبة باستخدام sort_custom(by_length).

للمدخلين 5 3 8 1 2 وelephant cat dolphin bee، يكون الناتج:

Ascending: [1, 2, 3, 5, 8]
Descending: [8, 5, 3, 2, 1]
Alphabetical: ["bee", "cat", "dolphin", "elephant"]
By length: ["bee", "cat", "dolphin", "elephant"]

جرّب بنفسك

extends Node

# اكتب دالة المقارنة by_length() هنا

func _ready():
	var numbers: Array[int] = []
	for text in OS.read_string_from_stdin().split(" ", false):
		numbers.append(int(text))
	var words := Array(OS.read_string_from_stdin().split(" ", false))
	# رتّب المصفوفات واطبع الأسطر الأربعة
	pass
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفّق التنفيذ

تدرّب بنفسك: مترجم GDScript عبر الإنترنت