Menu
CoddyTech

復習 - カスタムリスト

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 34/65。

challenge icon

チャレンジ

中級

custom_list.gdに、プライベートなArray _itemsをラップし、メソッドと仮想メソッドを通じてリストに必要な機能を提供するクラスCustomListを書いてください。

  • _init(items = [])はitemsのコピーを保存するため、渡されたArrayを後から変更してもリストには反映されません。
  • append(item)は末尾に項目を追加します。pop_back()は最後の項目を削除して返します。リストが空の場合はnullを返します。
  • get_at(index)は項目を返します。インデックスが0からsize() - 1の範囲外の場合はnullを返します。set_at(index, value)は項目を置き換えてtrueを返します。インデックスがリストの範囲外の場合はfalseを返します。
  • size()、has(item)、clear()は、同じ名前のArrayメソッドと同じように動作します。
  • concat(other)は+演算子の代わりとなります。このリストの項目の後にotherの項目が続く、新しいCustomListを返し、どちらのリストも変更しません。
  • _to_string()は、Arrayで表示されるのと同じ形式で項目を返します。たとえば[3, 1, 4]のようになります。
  • _iter_init()、_iter_next()、_iter_get()を使うと、forループで項目を順に処理できます。

提供されたコードは、最初の数値(1行にスペース区切りで記述。空の場合もあります)を読み取り、リストを作成し、渡されたArrayに99を追加して、リストを表示します。次に、コマンド数を読み取り、1行につき1つのコマンドを実行します。コマンドはappend N、pop、get I、set I N、has N、size、sum(リストを順に処理するforループ)、clear、concat N N ...です。次の入力の場合:

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

次のように表示されます:

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

コードはcustom_list.gdに記述してください。main.gdには提供された入出力コードがあり、編集できません。

自分で試してみよう

extends Node

func _ready():
	# 提供された入出力コード: そのままにしてください
	var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
	var list := CustomList.new(numbers)
	# リストは独自のコピーを保持する必要があります
	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

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: GDScriptオンラインコンパイラ