22. Tabel sebagai Daftar
Sebuah tabel adalah satu-satunya struktur data bawaan yang dimiliki Lua. Tergantung bagaimana kamu menggunakannya, tabel yang sama bisa menyimpan daftar nilai, kumpulan pasangan kunci-nilai, atau keduanya. Bab ini membahas bentuk daftar; bab berikutnya membahas bentuk kamus.
Membuat sebuah daftar
Daftar adalah tabel dengan nilai yang disimpan di bawah kunci
1, 2, 3, dan seterusnya. Cara
paling mudah membuatnya adalah dengan kurung kurawal:
local fruits = {"apple", "banana", "cherry"}
print(fruits[1]) -- apple
print(fruits[2]) -- banana
print(fruits[3]) -- cherryDua hal yang mungkin mengejutkan kalau kamu sudah pernah melihat bahasa lain:
- Indeks dimulai dari 1, bukan 0. Item pertama ada di
[1]. Roblox mengikuti konvensi yang sama. - Kurung siku
[...]digunakan untuk mengambil nilai; angka di dalamnya adalah indeksnya.
Variabel fruits menyimpan referensi ke tabel tersebut.
Nilai-nilai di dalam kurung kurawal menjadi item di posisi 1, 2, 3.
Panjang dengan #
Operator # yang sama yang kamu gunakan untuk string juga
bekerja pada daftar. Operator ini mengembalikan jumlah item:
local fruits = {"apple", "banana", "cherry"}
print(#fruits) -- 3
print(fruits[#fruits]) -- cherry (yang terakhir)fruits[#fruits] membaca nilai di posisi yang sama dengan
panjang daftar — yaitu yang terakhir. Ini adalah pola yang umum
digunakan.
Mengulang melalui daftar
Ada dua cara alami untuk menelusuri sebuah daftar.
for numerik
Kalau kamu hanya butuh item-itemnya, for numerik dari
1 sampai #t sudah cukup:
for i = 1, #fruits do
print(i, fruits[i])
endKeluaran:
1 apple
2 banana
3 cherry
ipairs
ipairs adalah iterator bawaan yang menghasilkan indeks
dan nilai secara berurutan, mulai dari 1:
for index, value in ipairs(fruits) do
print(index, value)
endKeluarannya sama. ipairs lebih idiomatis untuk daftar
karena membuat maksud — iterasi berurutan — menjadi jelas.
Buka exercises/22/01-list-loop.lua. Tambahkan buah
keempat lalu jalankan lagi. #fruits dan perulangan keduanya
harus menyesuaikan secara otomatis.
Menambah dan menghapus item
Dua cara untuk menambahkan item ke akhir daftar:
local fruits = {"apple", "banana"}
table.insert(fruits, "cherry") -- menambahkan ke akhir
fruits[#fruits + 1] = "date" -- juga menambahkan ke akhir; cara manual
print(fruits[3]) -- cherry
print(fruits[4]) -- datetable.insert(t, pos, value) menyisipkan di posisi
pos dan menggeser item setelahnya ke kanan:
table.insert(fruits, 1, "apricot") -- item pertama yang baru
print(fruits[1]) -- apricot
print(fruits[2]) -- apple (digeser dari 1 ke 2)table.remove(t, pos) menghapus nilai di posisi
pos dan menggeser item setelahnya ke kiri. Tanpa
pos, fungsi ini menghapus yang terakhir:
table.remove(fruits, 1) -- menghapus "apricot"
table.remove(fruits) -- menghapus item terakhir yang baruMengisi sebuah slot dengan nil
(fruits[2] = nil) tidak menggeser item
setelahnya; ini meninggalkan lubang di dalam daftar. Setelah itu,
#fruits dan ipairs mungkin berhenti menghitung
di lubang tersebut. Gunakan table.remove untuk menghapus
nilai dengan bersih.
Tabel diteruskan melalui referensi
Tabel berperilaku berbeda dari angka dan string dalam satu hal penting: menetapkan tabel ke variabel lain tidak membuat salinannya.
local a = {1, 2, 3}
local b = a -- b merujuk ke tabel yang SAMA
b[1] = 99
print(a[1]) -- 99 (perubahan terlihat melalui a juga)Baik a maupun b merujuk ke satu tabel yang
sama. Untuk salinan yang sesungguhnya kamu harus mengulang dan membangun
tabel baru — tidak ada table.copy bawaan. Kamu jarang
membutuhkannya.
PR
Soal 1 — Game favorit
Buka exercises/22/homework/01-favourite-games.lua. Buat
daftar berisi lima nama game. Dengan perulangan
for ... in ipairs(...) do, cetak masing-masing seperti
1. Roblox, 2. Minecraft, dan seterusnya.
Soal 2 — Jumlahkan daftar
Buka exercises/22/homework/02-sum-list.lua. Sebuah
daftar angka sudah dideklarasikan di bagian atas. Hitung dan cetak
jumlah totalnya.
Soal 3 — Sisipkan dan hapus
Buka exercises/22/homework/03-insert-remove.lua. Starter
memiliki sebuah daftar pendek. Lakukan empat hal, cetak daftar lengkap
setelah setiap langkah:
- Tambahkan item baru ke akhir.
- Sisipkan item lain di posisi 1.
- Hapus item terakhir.
- Hapus item di posisi 2.
Tantangan — Balik sebuah daftar
Buka exercises/22/homework/04-reverse.lua. Definisikan
sebuah local function reverse(list) yang mengembalikan
daftar baru dengan item-item yang dibalik, tanpa mengubah
daftar aslinya. Uji pada daftar string dan cetak keduanya sebelum dan
sesudah.
Kesulitan atau sudah selesai? Buka halaman solusi PR.