Menu
CoddyTech

Rückblick – Benutzerdefinierte Liste

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 34 von 65.

challenge icon

Aufgabe

Mittel

Schreibe CustomList in custom_list.gd: eine Klasse, die ein privates Array _items umschließt und über Methoden und virtuelle Methoden die Funktionen einer Liste bereitstellt:

  • _init(items = []) speichert eine Kopie von items, sodass spätere Änderungen am übergebenen Array die Liste nicht beeinflussen.
  • append(item) fügt am Ende ein Element hinzu. pop_back() entfernt das letzte Element und gibt es zurück oder gibt null zurück, wenn die Liste leer ist.
  • get_at(index) gibt das Element zurück oder null, wenn der Index außerhalb von 0 bis size() - 1 liegt. set_at(index, value) ersetzt das Element und gibt true zurück oder gibt false zurück, wenn der Index außerhalb der Liste liegt.
  • size(), has(item) und clear() funktionieren wie die gleichnamigen Array-Methoden.
  • concat(other) übernimmt die Funktion des Operators +: Die Methode gibt eine neue CustomList zurück, deren Elemente zuerst die dieser Liste und danach die Elemente von other sind, ohne eine der beiden Listen zu verändern.
  • _to_string() gibt die Elemente so zurück, wie ein Array sie ausgibt, zum Beispiel [3, 1, 4].
  • _iter_init(), _iter_next() und _iter_get() ermöglichen einer for-Schleife, die Elemente zu durchlaufen.

Der bereitgestellte Code liest die Anfangszahlen ein (eine Zeile, durch Leerzeichen getrennt, möglicherweise leer), erstellt die Liste, fügt 99 zum übergebenen Array hinzu und gibt die Liste aus. Anschließend liest er die Anzahl der Befehle ein und führt einen pro Zeile aus: append N, pop, get I, set I N, has N, size, sum (eine for-Schleife über die Liste), clear und concat N N .... Für diese Eingabe:

3 1 4
8
append 1
get 2
get 9
set 0 5
has 4
sum
pop
concat 9 2

gibt der Code Folgendes aus:

[3, 1, 4]
[3, 1, 4, 1]
Item 2: 4
No item at 9
[5, 1, 4, 1]
Has 4: true
Sum: 11
Popped 1
[5, 1, 4] + [9, 2] = [5, 1, 4, 9, 2]

Dein Code gehört in custom_list.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Eingabe-/Ausgabecode: unverändert lassen
	var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
	var list := CustomList.new(numbers)
	# Die Liste muss eine eigene Kopie behalten
	numbers.append(99)
	print(list)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ", false)
		match parts[0]:
			"append":
				list.append(int(parts[1]))
				print(list)
			"pop":
				var item = list.pop_back()
				print("Empty" if item == null else "Popped %d" % item)
			"get":
				var item = list.get_at(int(parts[1]))
				print(("No item at " + parts[1]) if item == null else "Item %s: %d" % [parts[1], item])
			"set":
				if list.set_at(int(parts[1]), int(parts[2])):
					print(list)
				else:
					print("No item at " + parts[1])
			"has":
				print("Has %s: %s" % [parts[1], list.has(int(parts[1]))])
			"size":
				print("Size: %d" % list.size())
			"sum":
				var total := 0
				for item in list:
					total += item
				print("Sum: %d" % total)
			"clear":
				list.clear()
				print(list)
			"concat":
				var other := CustomList.new(to_numbers(parts.slice(1)))
				print("%s + %s = %s" % [list, other, list.concat(other)])

func to_numbers(words: PackedStringArray) -> Array:
	var result := []
	for word in words:
		result.append(int(word))
	return result

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler