Menu
CoddyTech

Ordenação Personalizada

Parte da seção Lógica e fluxo do Journey de GDScript da Coddy. Lição 51 de 78.

sort() coloca um array em ordem crescente e altera o próprio array. Os números vão do menor para o maior, e as strings seguem a mesma ordem que min(), com as maiúsculas primeiro. reverse() então coloca em ordem decrescente:

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

Para qualquer outra ordem, chame sort_custom() com uma função de comparação. Ela recebe dois elementos, a e b, e retorna true quando a deve vir antes de b. Passe a função pelo nome, sem parênteses:

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

A comparação pode olhar dentro dos elementos. Esta coloca primeiro o dicionário com mais "hp":

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

A ordenação não é estável: elementos que são considerados iguais podem acabar em qualquer ordem. Quando os empates forem importantes, compare um segundo campo quando o primeiro for 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 em Array, mas não em PackedStringArray, que é retornado por split(); portanto, converta-o primeiro com Array(...). Você também encontrará a comparação escrita diretamente, como em sort_custom(func(a, b): return a > b). Essa forma é uma função lambda, abordada no capítulo Funções avançadas.

challenge icon

Desafio

Fácil

O programa lê duas linhas: números inteiros separados por espaços e palavras separadas por espaços. O código fornecido armazena esses valores em numbers (um array de inteiros) e words (um array de strings).

  1. Escreva uma função de comparação by_length(a: String, b: String) -> bool no nível superior. A palavra mais curta vem primeiro, e palavras com o mesmo comprimento ficam em ordem alfabética.
  2. Imprima quatro linhas: os números em ordem crescente, os números em ordem decrescente, as palavras em ordem alfabética (com sort()) e as palavras ordenadas com sort_custom(by_length).

Para as entradas 5 3 8 1 2 e elephant cat dolphin bee, a saída é:

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

Experimente você mesmo

extends Node

# Escreva a função de comparação by_length() aqui

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))
	# Ordene os arrays e imprima as quatro linhas
	pass
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e fluxo

Pratique por conta própria: Compilador de GDScript online