Ana içeriğe geç

Maps

Mapler anahtar değer (key pair) ikilisinden oluşan yapılardır. Hiçbir girdi aynı anahtara sahip olamaz Bir değere bakmak istediğimizde o değerin anahtarını da bilmemiz gerekmektedir.

Rust bizlere iki adet Map vermektedir. Bunlar:

  • Hash Map
  • Binary Map (binary tree map)

olmaktadır.

Hash map koleksiyonları heap içerisinde ayrılmış bir tabloda oluşurken binary tree değerleri yaprak ve köklerden oluşan düğümler bütününden oluşmaktadır. İki map'de birbirine benzer olmaktadır. Ancak anlatım kolaylığı açısından şu anlık burada hash map üzerinde duracağız.

Hashmap değerini sistemimize eklerken ilk olarak hashmap i main.rs dosyamız içerisine entegre etmemiz gerekmektedir.

use std::colections::Hashmap;

Sonrasında artık kodumuz içerisinde mutable bir hashmap oluşturabiliriz.

let mut hm = HashMap::new();

Binary heap için geçerli olduğu gibi burada da hashmap'in boyutunu len ve is_emtpy methodları ile kontrol etmek mümkün olmaktadır.

Hadi hashmap'imiz içerisine veri ekleyerek başlayalım!

hm.insert(1,1); // 1 anahtarına sahip 1 değeri
hm.insert(5,2); // 5 anahtarına sahip 2 değeri
hm.insert(30,3); // 30 anahtarına sahip 3 değeri

Oluştrurduğumuz hashmap'i artık yazdırabiliriz.

println!("{:?}", hm); // {1:1, 5:2, 30:3}

Daha önceden her bir anahtarın birden fazla değere sahip olamayacağını bahsetmiştik, peki bu durumda iki kez üst üste tanımlamaya çalışırsak ne olacak? İkinci yazdığımız ilk değeri güncelleyerek eski değeri kendine eşitleyecektir.

hm.insert(30,3);
let eski = hm.insert(30,5);

println!("{:?}", hm); // {1:1, 5:2, 30:5}

println!("{:?}", eski); // Some(3)

Some olarak dönderilmesinin nedeni herhangi bir değişkenin yerinin değişmemesi halindeki none değeridir.

Bir anahtarın var olup olmadığını contains_key() methodu ile kontrol edebiliriz. Bu sayede bir map içerisinde arama yapmış olabiliriz.

println!("{:?}", hm.contains_key(&5)); // True
println!("{:?}", hm.contains_key(&8)); // False

Peki bir key içerisinden nasıl veriyi çekebiliriz? Bu işlemi yapmak için get yapısını kullanmamız gerekmektedir.

println!("{:?}", hm.get(&5)); // Some(2)

Bu hashmap içerisiden veri silmek için de birçok yöntemimiz vardır. Bunlardan ilki remove() yapısını kullanmaktır. İçerisine çıkarmak istediğimiz verinin anahtarının referansını almaktadır.

hm.remove(&1);
println!("{:?}", hm); // {30:4, 5:2}

Bu işlem aynı zamanda pop gibi içerisinden çıkarılan elemanı kendine eşitlemektedir. Bu nedenle direkt olarak bir değişkene eşitlenip kullanılabilir.

Bir diğer silme işlemi de remove_entry olmaktadır. Bu işlem normal remove yapısına kıyasla bir değişkene eşitlendiğinde hem değeri hemde anahtarı ifade etmektedir.

let remove = hm.remove_entry(&5); // Some(5,2)

Tüm listeyi silmek için clear methodunu kullanabilir ve bu durumun kesinlikle gerçekleştiğini test etmek için is_empty() yapısını kullanabiliriz.

hm.clear();

println!("{}", hm.is_empty()); // True