Menu
CoddyTech

Benutzerdefiniertes Sortieren

Teil des Abschnitts Logik & Ablaufsteuerung der GDScript-Journey von Coddy. Lektion 51 von 78.

sort() sortiert ein Array in aufsteigender Reihenfolge und verändert das Array selbst. Zahlen werden von der kleinsten zur größten sortiert, und Zeichenfolgen folgen derselben Reihenfolge wie bei min(), wobei Großbuchstaben zuerst kommen. reverse() sorgt anschließend für eine absteigende Reihenfolge:

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

Für jede andere Reihenfolge rufst du sort_custom() mit einer Vergleichsfunktion auf. Sie erhält zwei Elemente, a und b, und gibt true zurück, wenn a vor b stehen muss. Übergib die Funktion über ihren Namen, ohne Klammern:

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

Der Vergleich kann in die Elemente hineinschauen. Dieser setzt das Wörterbuch mit dem höchsten "hp"-Wert an den Anfang:

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

Die Sortierung ist nicht stabil: Elemente, die als gleich verglichen werden, können in beliebiger Reihenfolge enden. Wenn es auf die Reihenfolge bei Gleichständen ankommt, vergleiche ein zweites Feld, wenn das erste gleich ist:

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() gibt es bei Array, aber nicht bei PackedStringArray, das split() zurückgibt. Wandle es daher zuerst mit Array(...) um. Du wirst auch auf den inline geschriebenen Vergleich stoßen, wie in sort_custom(func(a, b): return a > b). Diese Form ist eine Lambda-Funktion, die im Kapitel „Erweiterte Funktionen“ behandelt wird.

challenge icon

Aufgabe

Einfach

Das Programm liest zwei Zeilen ein: durch Leerzeichen getrennte ganze Zahlen und durch Leerzeichen getrennte Wörter. Der angegebene Code speichert sie in numbers (einem Array von Ganzzahlen) und words (einem Array von Zeichenketten).

  1. Schreibe auf der obersten Ebene eine Vergleichsfunktion by_length(a: String, b: String) -> bool. Ein kürzeres Wort steht zuerst, und Wörter gleicher Länge werden alphabetisch sortiert.
  2. Gib vier Zeilen aus: die Zahlen in aufsteigender Reihenfolge, die Zahlen in absteigender Reihenfolge, die Wörter in alphabetischer Reihenfolge (mit sort()) und die mit sort_custom(by_length) sortierten Wörter.

Für die Eingaben 5 3 8 1 2 und elephant cat dolphin bee lautet die Ausgabe:

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

Probier es selbst

extends Node

# Schreibe hier die Vergleichsfunktion 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))
	# Sortiere die Arrays und gib die vier Zeilen aus
	pass
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablaufsteuerung

Übe selbstständig: Online-GDScript-Compiler