Menu
CoddyTech

自定义排序

本课属于 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,将在“高级函数”章中介绍。

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 在线编译器