Menu
CoddyTech

Tri personnalisé

Fait partie de la section Logique et flux d’exécution du Journey GDScript de Coddy. Leçon 51 sur 78.

sort() place un tableau dans l’ordre croissant et modifie le tableau lui-même. Les nombres vont du plus petit au plus grand, et les chaînes suivent le même ordre que min(), les majuscules d’abord. reverse() donne ensuite l’ordre décroissant :

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

Pour tout autre ordre, appelez sort_custom() avec une fonction de comparaison. Elle reçoit deux éléments, a et b, et renvoie true lorsque a doit venir avant b. Passez la fonction par son nom, sans parenthèses :

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

La comparaison peut examiner les éléments. Celle-ci place en premier le dictionnaire qui a le plus de "hp" :

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

Le tri n’est pas stable : les éléments considérés comme égaux peuvent se retrouver dans n’importe quel ordre. Lorsque les égalités comptent, compare un second champ lorsque le premier est égal :

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() existe sur Array, mais pas sur le PackedStringArray que renvoie split() ; convertissez-le donc d’abord avec Array(...). Vous rencontrerez également la comparaison écrite en ligne, comme dans sort_custom(func(a, b): return a > b). Cette forme est une lambda, abordée dans le chapitre Fonctions avancées.

challenge icon

Défi

Facile

Le programme lit deux lignes : des nombres entiers séparés par des espaces et des mots séparés par des espaces. Le code fourni les stocke dans numbers (un tableau d’entiers) et words (un tableau de chaînes de caractères).

  1. Écrivez une fonction de comparaison by_length(a: String, b: String) -> bool au niveau supérieur. Le mot le plus court vient en premier, et les mots de même longueur sont classés par ordre alphabétique.
  2. Affichez quatre lignes : les nombres par ordre croissant, les nombres par ordre décroissant, les mots par ordre alphabétique (avec sort()) et les mots triés avec sort_custom(by_length).

Pour les entrées 5 3 8 1 2 et elephant cat dolphin bee, la sortie est :

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

Essayez vous-même

extends Node

# Écrivez la fonction de comparaison by_length() ici

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))
	# Triez les tableaux et affichez les quatre lignes
	pass
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et flux d’exécution

Entraînez-vous par vous-même : Compilateur GDScript en ligne