24. Library tabel
Kamu sudah membangun tabel secara manual dan menelusurinya dengan
ipairs dan pairs. Lua juga menyertakan sebuah
library tabel kecil — fungsi-fungsi siap pakai untuk
pekerjaan list yang kamu lakukan berulang kali: menambah, menghapus,
menggabungkan ke string, dan mengurutkan. Kuasai keempat fungsi ini dan
kamu tidak perlu membuatnya sendiri dari nol.
Bab ini menggunakan bentuk list dari tabel yang dibahas di Bab 22.
Menambah dan menghapus (kilas balik)
Kamu sudah bertemu fungsi-fungsi ini di Bab 22; ini dia semuanya sekaligus.
local items = {"sword", "shield"}
table.insert(items, "potion") -- tambah ke ujung
table.insert(items, 1, "torch") -- sisipkan di posisi 1
table.remove(items, 2) -- hapus posisi 2
table.remove(items) -- hapus yang terakhirFungsi-fungsi ini menggeser item lainnya supaya list tetap rapat
tanpa celah — itulah alasan kamu menggunakannya daripada menyetel slot
ke nil sendiri.
Menggabungkan list
menjadi teks: table.concat
table.concat(list, separator) menempelkan setiap item
menjadi satu string, dengan separator di antara masing-masing item. Item
harus berupa string atau angka.
local fruits = {"apple", "banana", "cherry"}
print(table.concat(fruits, ", ")) -- apple, banana, cherry
print(table.concat(fruits, " - ")) -- apple - banana - cherry
print(table.concat(fruits)) -- applebananacherry (tanpa separator)Jauh lebih rapi dibanding membangun string dengan perulangan dan
... Untuk menampilkan sebuah list dalam satu
baris, gunakan concat.
Buka exercises/24/01-concat.lua. Sudah ada sebuah list
angka di sana. Cetak semuanya dalam satu baris dengan pemisah
" + ", lalu cetak sekali lagi dengan pemisah spasi.
Mengurutkan list:
table.sort
table.sort(list) menata ulang list di
tempat secara urutan naik. Fungsi ini mengubah list aslinya,
bukan mengembalikan list baru.
local scores = {30, 12, 7, 24}
table.sort(scores)
print(table.concat(scores, " ")) -- 7 12 24 30Fungsi ini juga mengurutkan teks secara alfabetis:
local names = {"Cara", "Ada", "Ben"}
table.sort(names)
print(table.concat(names, ", ")) -- Ada, Ben, CaraMengurutkan dengan cara sendiri
Untuk mengurutkan secara berbeda, berikan table.sort
sebuah fungsi yang menerima dua item dan mengembalikan true
jika item pertama harus berada sebelum item kedua.
Untuk urutan menurun, "sebelum" berarti "lebih besar":
local scores = {30, 12, 7, 24}
table.sort(scores, function(a, b)
return a > b
end)
print(table.concat(scores, " ")) -- 30 24 12 7Fungsi kecil itu disebut komparator. Kamu menulisnya
sekali, langsung di tempat, dan table.sort akan
memanggilnya sebanyak yang diperlukan — ini adalah pengalaman pertamamu
melempar sebuah fungsi ke dalam fungsi lain, sebuah ide yang
sangat berguna dan akan kamu temui lagi nanti.
Menyebarkan list:
table.unpack
table.unpack(list) mengubah sebuah list kembali menjadi
nilai-nilai terpisah — kebalikan dari multi-assignment yang kamu lihat
di Bab 11:
local point = {3, 4}
local x, y = table.unpack(point)
print(x, y) -- 3 4Ini juga berguna untuk mengoper list ke fungsi yang membutuhkan argumen terpisah:
local nums = {5, 9, 2}
print(math.max(table.unpack(nums))) -- 9PR (Pekerjaan Rumah)
File PR ada di exercises/24/homework/.
Soal 1 — Antrean belanja
Buka exercises/24/homework/01-shopping-line.lua. Sudah
ada sebuah list nama item. Cetak semuanya dalam satu baris dipisahkan
koma, menggunakan table.concat.
Soal 2 — Dari tinggi ke rendah
Buka exercises/24/homework/02-high-to-low.lua. Sudah ada
sebuah list angka. Urutkan dari yang terbesar ke terkecil menggunakan
komparator, lalu cetak dengan table.concat.
Soal 3 — Papan peringkat
Buka exercises/24/homework/03-leaderboard.lua. Sudah ada
sebuah list nama pemain yang acak. Urutkan secara alfabetis dan cetak
papan peringkat bernomor, satu per baris (1. Ada,
2. Ben, ...).
Tantangan — Tiga teratas
Buka exercises/24/homework/04-top-three.lua. Sudah ada
sebuah list skor. Urutkan dari yang tertinggi, lalu cetak hanya tiga
teratas dalam satu baris dipisahkan " ". Gunakan
table.sort dan table.concat, ditambah
perulangan kecil atau slice untuk mengambil tiga yang pertama saja.
Buntu atau sudah selesai? Buka halaman solusi PR.