Menu
CoddyTech

Ordenación personalizada

Parte de la sección Lógica y flujo del Journey de GDScript de Coddy. Lección 51 de 78.

sort() ordena un arreglo de forma ascendente y modifica el propio arreglo. Los números van del más pequeño al más grande, y las cadenas siguen el mismo orden que min(), primero las mayúsculas. reverse() después las ordena de forma descendente:

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

Para cualquier otro orden, llama a sort_custom() con una función de comparación. Recibe dos elementos, a y b, y devuelve true cuando a debe ir antes que b. Pasa la función por su nombre, sin paréntesis:

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 comparación puede mirar dentro de los elementos. Esta coloca primero el diccionario con más "hp":

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

La ordenación no es estable: los elementos que se comparan como iguales pueden acabar en cualquier orden. Cuando los empates importan, compara un segundo campo cuando el primero sea igual:

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 en Array, pero no en PackedStringArray, que es lo que devuelve split(), así que primero conviértelo con Array(...). También encontrarás la comparación escrita en línea, como en sort_custom(func(a, b): return a > b). Esa forma es una función lambda, que se aborda en el capítulo Funciones avanzadas.

challenge icon

Desafío

Fácil

El programa lee dos líneas: números enteros separados por espacios y palabras separadas por espacios. El código dado los almacena en numbers (un array de enteros) y words (un array de cadenas).

  1. Escribe una función de comparación by_length(a: String, b: String) -> bool en el nivel superior. Las palabras más cortas van primero y las palabras de la misma longitud se ordenan alfabéticamente.
  2. Imprime cuatro líneas: los números en orden ascendente, los números en orden descendente, las palabras en orden alfabético (con sort()) y las palabras ordenadas con sort_custom(by_length).

Para las entradas 5 3 8 1 2 y elephant cat dolphin bee, la salida es:

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

Pruébalo tú mismo

extends Node

# Escribe aquí la función de comparación 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))
	# Ordena los arrays e imprime las cuatro líneas
	pass
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de GDScript online