CodeBlanks Logo Icon CodeBlanks

Koleksiyon iterasyonu

HashMap ve Vec üzerinde iterasyon yöntemlerini öğrenirsin.

Koleksiyon iterasyonu

Haritalar üç biçimde dolaşılır; her biri farklı bir ödünç türüdür:

for (k, v) in &harita { }        // (&K, &V)
for (k, v) in &mut harita { }    // (&K, &mut V): değerler değiştirilebilir
for (k, v) in harita { }         // (K, V): harita tüketilir

harita.keys()         // &K
harita.values()       // &V
harita.values_mut()   // &mut V

Anahtarlar hiçbir zaman değiştirilebilir verilmez; anahtarı değiştirmek hash'i bozardı.

Değerleri güncellemek ve süzmek

Tüm değerlere aynı işlemi uygulamak için values_mut; koşula uymayan girdileri silmek için retain:

let mut fiyat = HashMap::from([("kalem", 5), ("defter", 12), ("silgi", 2)]);
for v in fiyat.values_mut() {
    *v *= 2;
}
fiyat.retain(|_, v| *v > 5);
let toplam: u32 = fiyat.values().sum();   // 10 + 24 = 34

HashMap::from([...]) diziden doğrudan harita kurar.

Uygulama Fiyat güncelle

HashMap::from([("kalem", 5), ("defter", 12)]) ile başla. values_mut ile tüm fiyatları ikiye katla. Sıralanmış anahtar vektörünü ve değerlerin toplamını (u32) boşlukla yazdır.

Başlangıç kodu

main.rs
use std::collections::HashMap;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::collections::HashMap;

fn main() {
    let mut fiyat: HashMap<&str, u32> = HashMap::from([("kalem", 5), ("defter", 12)]);
    for v in fiyat.values_mut() {
        *v *= 2;
    }
    let mut anahtarlar: Vec<&str> = fiyat.keys().copied().collect();
    anahtarlar.sort();
    let toplam: u32 = fiyat.values().sum();
    println!("{:?} {}", anahtarlar, toplam);
}

Beklenen çıktı

["defter", "kalem"] 34

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Dolaşırken haritaya yeni anahtar eklenebilir mi?

  • Yalnızca BTreeMap'te
  • Hayır; dolaşma haritayı ödünç alır Doğru cevap
  • Evet, her zaman
  • Yalnızca HashMap'te

Açıklama: Eklenecekleri önce ayrı bir vektörde topla, döngüden sonra ekle; ya da retain ile yerinde süz.

2 Değerleri değiştir

Soru
for v in fiyat.____() {
    *v *= 2;
}
Cevap
for v in fiyat.values_mut() {
    *v *= 2;
}

Açıklama: values_mut değerlere &mut referans verir.

3 Yöntem ve verdiği

Kavram Anlamı
keys() &K
values() &V
values_mut() &mut V
into_iter() (K, V)

Orta seviye bölümündeki tüm dersler