Menu
CoddyTech

Sắp xếp tùy chỉnh

Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 51 trên 78.

sort() sắp xếp mảng theo thứ tự tăng dần và thay đổi chính mảng đó. Số được sắp xếp từ nhỏ đến lớn, còn chuỗi theo thứ tự giống như min(), chữ hoa đứng trước. Sau đó, reverse() sắp xếp theo thứ tự giảm dần:

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

Với mọi thứ tự khác, hãy gọi sort_custom() bằng một hàm so sánh. Hàm này nhận hai phần tử, a và b, rồi trả về true khi a phải đứng trước b. Truyền tên hàm, không có dấu ngoặc đơn:

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"]

Phép so sánh có thể kiểm tra các phần tử bên trong. Cách này đặt từ điển có "hp" lớn nhất lên trước:

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

Thứ tự sắp xếp không ổn định: các phần tử được so sánh là bằng nhau có thể nằm ở bất kỳ thứ tự nào. Khi thứ tự giữa các phần tử bằng nhau quan trọng, hãy so sánh một trường thứ hai khi trường thứ nhất bằng nhau:

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() có trong Array, nhưng không có trong PackedStringArray mà split() trả về, vì vậy trước tiên hãy chuyển đổi bằng Array(...). Bạn cũng sẽ gặp phép so sánh được viết trực tiếp, như trong sort_custom(func(a, b): return a > b). Cách viết đó là một lambda, được đề cập trong chương Hàm nâng cao.

challenge icon

Thử thách

Dễ

Chương trình đọc hai dòng: các số nguyên cách nhau bằng dấu cách và các từ cách nhau bằng dấu cách. Mã đã cho lưu chúng trong numbers (một mảng số nguyên) và words (một mảng chuỗi).

  1. Viết hàm so sánh by_length(a: String, b: String) -> bool ở cấp cao nhất. Từ ngắn hơn đứng trước, còn các từ có cùng độ dài được xếp theo thứ tự bảng chữ cái.
  2. In ra bốn dòng: các số theo thứ tự tăng dần, các số theo thứ tự giảm dần, các từ theo thứ tự bảng chữ cái (bằng sort()) và các từ được sắp xếp bằng sort_custom(by_length).

Với đầu vào 5 3 8 1 2 và elephant cat dolphin bee, đầu ra là:

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

Tự làm thử

extends Node

# Viết hàm (function) so sánh by_length() ở đây

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))
	# Sắp xếp các mảng rồi in ra bốn dòng
	pass
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch GDScript online