Menu
CoddyTech

Ôn tập: danh sách tùy chỉnh

Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 34 trên 65.

challenge icon

Thử thách

Trung bình

Viết CustomList trong custom_list.gd, một lớp bọc quanh mảng riêng tư _items và cung cấp những gì một danh sách cần thông qua các phương thức và phương thức ảo:

  • _init(items = []) lưu một bản sao của items, vì vậy những thay đổi sau này đối với mảng được truyền vào sẽ không ảnh hưởng đến danh sách.
  • append(item) thêm một phần tử vào cuối. pop_back() xóa và trả về phần tử cuối cùng, hoặc trả về null khi danh sách trống.
  • get_at(index) trả về phần tử, hoặc null khi chỉ số nằm ngoài khoảng từ 0 đến size() - 1. set_at(index, value) thay thế phần tử và trả về true, hoặc trả về false nếu chỉ số nằm ngoài danh sách.
  • size(), has(item) và clear() hoạt động giống như các phương thức của mảng có cùng tên.
  • concat(other) thay cho toán tử +: phương thức này trả về một CustomList mới, gồm các phần tử của danh sách này, theo sau là các phần tử của other, và không thay đổi danh sách nào.
  • _to_string() trả về các phần tử theo cách mảng in ra chúng, chẳng hạn như [3, 1, 4].
  • _iter_init(), _iter_next() và _iter_get() cho phép vòng lặp for duyệt qua các phần tử.

Code được cung cấp đọc các số ban đầu (một dòng, cách nhau bằng dấu cách, có thể để trống), tạo danh sách, thêm 99 vào mảng đã truyền vào rồi in danh sách. Sau đó, code đọc số lượng lệnh và chạy từng lệnh trên một dòng: append N, pop, get I, set I N, has N, size, sum (một vòng lặp for duyệt qua danh sách), clear và concat N N .... Với đầu vào sau:

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

chương trình in ra:

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

Viết code của bạn trong custom_list.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
	var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
	var list := CustomList.new(numbers)
	# Danh sách (list) phải giữ một bản sao riêng
	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

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch GDScript online