CodeBlanks Logo Icon CodeBlanks

Entry API

Entry API ile haritaya güvenli ekleme yaparsın.

Entry API

"Anahtar yoksa ekle, varsa güncelle" işi için entry kullanılır. Tek arama yapar ve değere değiştirilebilir referans verir:

let metin = "elma armut elma kiraz elma armut";
let mut sayim = HashMap::new();
for k in metin.split_whitespace() {
    *sayim.entry(k).or_insert(0) += 1;
}

or_insert(0) anahtar yoksa 0 koyar ve her durumda &mut V döndürür; * ile çözülüp artırılır.

Diğer entry yöntemleri

or_default() türün varsayılanını koyar; and_modify yalnızca var olan değeri değiştirir:

let mut gruplar: HashMap<char, Vec<&str>> = HashMap::new();
for k in ["elma", "erik", "ayva"] {
    gruplar.entry(k.chars().next().unwrap()).or_default().push(k);
}

let mut puan = HashMap::new();
puan.entry("ali").and_modify(|p| *p += 10).or_insert(50);   // yoksa 50, varsa +10

Uygulama Kelime sayımı

"elma armut elma kiraz elma armut" metnindeki kelimeleri entry(..).or_insert(0) ile say. Sonucu bir Vec'e topla, sırala ve {:?} ile 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 metin = "elma armut elma kiraz elma armut";
    let mut sayim = HashMap::new();
    for k in metin.split_whitespace() {
        *sayim.entry(k).or_insert(0) += 1;
    }
    let mut v: Vec<(&str, i32)> = sayim.into_iter().collect();
    v.sort();
    println!("{:?}", v);
}

Beklenen çıktı

[("armut", 2), ("elma", 3), ("kiraz", 1)]

Soru ve cevaplar

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

1 <code>or_insert_with(Vec::new)</code> ile <code>or_insert(Vec::new())</code> farkı nedir?

  • or_insert hata verir
  • or_insert_with sıralar
  • or_insert_with değeri yalnızca anahtar yoksa üretir Doğru cevap
  • Fark yok

Açıklama: or_insert argümanı her zaman hesaplanır; pahalı varsayılanlar için or_insert_with ya da or_default tercih edilir.

2 Yoksa başlat

Soru
*sayim.entry(k).____(0) += 1;
Cevap
*sayim.entry(k).or_insert(0) += 1;

Açıklama: or_insert yoksa değeri koyar ve &mut V döndürür.

3 Yöntem ve davranışı

Kavram Anlamı
or_insert(v) Yoksa v koy
or_insert_with(f) Yoksa f() çağır
or_default() Yoksa Default
and_modify(f) Varsa değiştir

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