Menu
CoddyTech

מיון מותאם אישית

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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 אונליין