Lewati ke isi
JRG++JRG++ v0.2.0

JRG 11 · JRG Lanjut

Dict: Data Berpasangan

Menyimpan data yang dicari berdasarkan nama, bukan nomor urut. Seperti kamus: kamu cari kata, dapat artinya.

koleksiKapan array tidak cukup

Array bagus untuk daftar berurutan. Tapi kalau kamu ingin menyimpan nilai per nama — nilai Sari, nilai Budi — nomor urut tidak membantu.

dict.jrg
pub fn main() {
    let nilai = {"Sari": 88, "Budi": 76, "Tono": 91}
    wok(nilai)
    wok("Nilai Sari:", nilai["Sari"])
    wok("Jumlah data:", len(nilai))
}
dict {Budi: 76, Sari: 88, Tono: 91}
Nilai Sari: 88
Jumlah data: 3

Menambah, mengubah, memeriksa

dict-ubah.jrg
pub fn main() {
    var nilai = {"Sari": 88}
    nilai["Budi"] = 76        // menambah
    nilai["Sari"] = 90        // mengubah
    wok(nilai)
    wok("Ada Tono?", dict::has(nilai, "Tono"))
    wok("Nilai Tono:", dict::get(nilai, "Tono"))
}
dict {Budi: 76, Sari: 90}
Ada Tono? false
Nilai Tono: Option::None

Menelusuri isi dict

Sama seperti array, bentuk dua-nama yang memberi kunci dan nilainya.

dict-loop.jrg
pub fn main() {
    let nilai = {"Sari": 88, "Budi": 76, "Tono": 91}
    for nama, n in nilai {
        wok(nama, "->", n)
    }
}
Budi -> 76
Sari -> 88
Tono -> 91

Kunci selalu berupa teks

Apa pun yang kamu pakai sebagai kunci akan disimpan sebagai bentuk tulisannya. Jadi d[0] dan d["0"] menunjuk tempat yang sama.

kunci.jrg
pub fn main() {
    var d = dict::new()
    d[1] = "satu"
    wok(d)
    wok(d["1"])       // kunci yang sama
}
dict {1: satu}
satu

Contoh nyata: menghitung frekuensi

frekuensi.jrg
pub fn main() {
    let kata = ["apel", "jeruk", "apel", "mangga", "apel", "jeruk"]
    var hitung = dict::new()

    for _, k in kata {
        if dict::has(hitung, k) {
            hitung[k] = hitung[k] + 1
        } else {
            hitung[k] = 1
        }
    }

    for nama, n in hitung {
        wok(nama, ":", n)
    }
}
apel : 3
jeruk : 2
mangga : 1

Fungsi bawaan dict

FungsiHasilnya
dict::keys(d)Array berisi semua kunci
dict::values(d)Array berisi semua nilai
dict::has(d, k)true / false
dict::get(d, k)Some(v) atau None
len(d)Banyaknya pasangan
dict-fn.jrg
pub fn main() {
    let nilai = {"Sari": 88, "Budi": 76, "Tono": 91}
    wok(dict::keys(nilai))
    wok(dict::values(nilai))
    wok("Rata-rata:", arr::mean(dict::values(nilai)))
}
[Budi, Sari, Tono]
[76, 88, 91]
Rata-rata: 85.0

Kuis 1

Kapan dict lebih cocok daripada array?

Kuis 2

Apa hasil dict::get(d, "tidakAda")?

Latihan mandiri

1. Buat dict harga tiga barang, lalu cetak total harganya.

2. Cari barang termahal dari dict itu.

Jawaban 1: arr::sum(dict::values(d)).
Jawaban 2: telusuri dengan for nama, h in d sambil menyimpan yang terbesar, atau arr::max(dict::values(d)) kalau nama barangnya tidak diperlukan.