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.
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: 3Menambah, mengubah, memeriksa
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::NoneMenelusuri isi dict
Sama seperti array, bentuk dua-nama yang memberi kunci dan nilainya.
pub fn main() {
let nilai = {"Sari": 88, "Budi": 76, "Tono": 91}
for nama, n in nilai {
wok(nama, "->", n)
}
}Budi -> 76
Sari -> 88
Tono -> 91Kunci 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.
pub fn main() {
var d = dict::new()
d[1] = "satu"
wok(d)
wok(d["1"]) // kunci yang sama
}dict {1: satu}
satuContoh nyata: menghitung frekuensi
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 : 1Fungsi bawaan dict
| Fungsi | Hasilnya |
|---|---|
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 |
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.0Kuis 1
Kapan dict lebih cocok daripada array?
Tepat.
Yang membedakan bukan banyaknya data, melainkan cara mencarinya.
Kuis 2
Apa hasil dict::get(d, "tidakAda")?
Betul — sama seperti a.get(i) pada array.
JRG memakai Option untuk hal yang mungkin tidak ketemu.
Latihan mandiri
1. Buat dict harga tiga barang, lalu cetak total harganya.
2. Cari barang termahal dari dict itu.
arr::sum(dict::values(d)).for nama, h in d sambil menyimpan yang terbesar, atau arr::max(dict::values(d)) kalau nama barangnya tidak diperlukan.