Menu
CoddyTech

Sortowanie niestandardowe

Część sekcji Logika i przepływ programu ścieżki GDScript w Coddy. Lekcja 51 z 78.

sort() porządkuje tablicę rosnąco i zmienia samą tablicę. Liczby są uporządkowane od najmniejszej do największej, a ciągi znaków według tej samej kolejności co w min(), najpierw wielkie litery. reverse() zmienia kolejność na malejącą:

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

W przypadku każdej innej kolejności wywołaj sort_custom() z funkcją porównującą. Otrzymuje ona dwa elementy, a i b, i zwraca true, gdy a musi znaleźć się przed b. Przekaż funkcję, podając jej nazwę, bez nawiasów:

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

Porównanie może sprawdzać elementy. Ta funkcja umieszcza na początku słownik z największą wartością "hp":

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

Sortowanie nie jest stabilne: elementy, które są uznawane za równe, mogą znaleźć się w dowolnej kolejności. Gdy kolejność elementów o równych wartościach ma znaczenie, porównaj drugie pole, gdy pierwsze jest równe:

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() jest dostępne w Array, ale nie w PackedStringArray, które zwraca split(), więc najpierw przekonwertuj je za pomocą Array(...). Spotkasz się też z porównaniem zapisanym bezpośrednio w wywołaniu, tak jak w sort_custom(func(a, b): return a > b). Taka forma to lambda, omawiana w rozdziale Funkcje zaawansowane.

challenge icon

Wyzwanie

Łatwy

Program odczytuje dwa wiersze: liczby całkowite oddzielone spacjami oraz słowa oddzielone spacjami. Podany kod przechowuje je w numbers (tablicy liczb całkowitych) i words (tablicy ciągów znaków).

  1. Na najwyższym poziomie napisz funkcję porównującą by_length(a: String, b: String) -> bool. Krótsze słowo powinno być pierwsze, a słowa o tej samej długości powinny być uporządkowane alfabetycznie.
  2. Wyświetl cztery wiersze: liczby w kolejności rosnącej, liczby w kolejności malejącej, słowa w kolejności alfabetycznej (za pomocą sort()) oraz słowa posortowane za pomocą sort_custom(by_length).

Dla danych wejściowych 5 3 8 1 2 i elephant cat dolphin bee wynikiem jest:

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

Spróbuj swoich sił

extends Node

# Napisz tutaj funkcję porównującą 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))
	# Posortuj tablice i wypisz cztery wiersze
	pass
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator GDScript online