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 terakhir

Fungsi-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 30

Fungsi ini juga mengurutkan teks secara alfabetis:

local names = {"Cara", "Ada", "Ben"}
table.sort(names)
print(table.concat(names, ", "))   -- Ada, Ben, Cara

Mengurutkan 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 7

Fungsi 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   4

Ini juga berguna untuk mengoper list ke fungsi yang membutuhkan argumen terpisah:

local nums = {5, 9, 2}
print(math.max(table.unpack(nums)))   -- 9

PR (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.