Menu
CoddyTech

Ordinamento personalizzato

Fa parte della sezione Logica e flusso del percorso GDScript di Coddy. Lezione 51 di 78.

sort() mette un array in ordine crescente e modifica l’array stesso. I numeri vanno dal più piccolo al più grande e le stringhe seguono lo stesso ordine di min(), prima le maiuscole. reverse() imposta quindi l’ordine decrescente:

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

Per qualsiasi altro ordine, chiama sort_custom() con una funzione di confronto. Riceve due elementi, a e b, e restituisce true quando a deve precedere b. Passa la funzione usando il suo nome, senza parentesi:

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

Il confronto può esaminare gli elementi. Questo mette per primo il dizionario con più "hp":

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

L'ordinamento non è stabile: gli elementi che risultano uguali nel confronto possono finire in qualsiasi ordine. Quando l'ordine in caso di parità è importante, confronta un secondo campo quando il primo è uguale:

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() è disponibile su Array, ma non su PackedStringArray che split() restituisce, quindi converti prima con Array(...). Incontrerai anche il confronto scritto direttamente, come in sort_custom(func(a, b): return a > b). Questa forma è una lambda, trattata nel capitolo Funzioni avanzate.

challenge icon

Sfida

Facile

Il programma legge due righe: numeri interi separati da spazi e parole separate da spazi. Il codice fornito li memorizza in numbers (un array di int) e words (un array di stringhe).

  1. Scrivi una funzione di confronto by_length(a: String, b: String) -> bool al livello principale. Le parole più corte vengono prima e le parole della stessa lunghezza sono in ordine alfabetico.
  2. Stampa quattro righe: i numeri in ordine crescente, i numeri in ordine decrescente, le parole in ordine alfabetico (con sort()) e le parole ordinate con sort_custom(by_length).

Per gli input 5 3 8 1 2 e elephant cat dolphin bee, l'output è:

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

Provalo tu

extends Node

# Scrivi qui la funzione di confronto 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))
	# Ordina gli array e stampa le quattro righe
	pass
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore GDScript online