自定义排序
本课属于 Coddy GDScript 学习旅程的“逻辑与流程”单元。第 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,并在 a 必须排在 b 前面时返回 true。传入函数名,不要加括号:
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,但不属于 split() 返回的 PackedStringArray,所以要先用 Array(...) 转换它。你还会遇到以内联方式编写的比较表达式,例如 sort_custom(func(a, b): return a > b)。这种形式是 lambda,将在“高级函数”章中介绍。
挑战
简单程序会读取两行内容:用空格分隔的整数,以及用空格分隔的单词。给定的代码会将它们存储在 numbers(整数数组)和 words(字符串数组)中。
- 在顶层编写比较函数
by_length(a: String, b: String) -> bool。较短的单词排在前面,长度相同的单词按字母顺序排列。 - 打印四行:按升序排列的数字、按降序排列的数字、按字母顺序排列的单词(使用
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
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: GDScript 在线编译器