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.
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).
- 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. - 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ằngsort_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
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
1Chuyên sâu về chuỗi
Các phương thức của chuỗiTìm kiếm trong chuỗiThay thế và xóa khoảng trắngTách và nốiÔn tập: Kiểm tra tên người dùng7Kiểu liệt kê
Kiểu liệt kê là gì?Định nghĩa kiểu liệt kêCác giá trị của kiểu liệt kêKiểu liệt kê trong matchÔn tập: đèn giao thông10Hàm nâng cao
Trả về nhiều giá trịHàm lambda phần 1Hàm lambda phần 2Ôn tập: sắp xếp bằng lambdaHàm đệ quy phần 1Hàm đệ quy phần 2Ôn tập: tính tổng mảng lồng nhau13Hệ thống quản lý hàng tồn kho
Tổng quan dự ánThêm mặt hàng2Ra quyết định nâng cao
So khớp với biếnĐiều kiện bảo vệ trong so khớpMẫu mảngMẫu từ điểnKiểm tra thành viênÔn tập: Bộ phân tích lệnh5Ứng dụng sổ liên lạc
Hiển thị menuThêm liên hệ8Trình quản lý hồ sơ học sinh
Tổng quan dự ánThêm học sinh3Mảng nhiều chiều
Cơ bản về mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuVòng lặp lồng nhau với mảng 2 chiềuÔn tập: mảng 2 chiềuMảng răng cưaCác mẫu phổ biến với mảng 2 chiềuÔn tập: bàn cờ6Tập hợp với từ điển
Tập hợp là gì?Từ điển như một tập hợpThêm và xóaHợp và giaoHiệu tập hợpÔn tập: Xóa phần tử trùng lặp9Tổng hợp dữ liệu nâng cao
Tính tổng các giá trịTìm giá trị nhỏ nhất và lớn nhấtSắp xếp tùy chỉnhÔn tập: Sắp xếp từ điểnTự luyện tập: Trình biên dịch GDScript online