Daha önceki yazılarımızda Dart dilindeki List (Liste) yapısını incelemiştik. Listeler verileri sıralı tutmak için harikadır. Ancak bazen verilerin sırası bizim için önemsiz olabilir veya listemizde aynı veriden sadece bir tane olmasını (unique) isteyebiliriz. İşte bu noktada devreye HashSet girer.
HashSet yapısı, Listelerden iki temel özellikle ayrılır:
- Sırasızdır: Veriler eklenme sırasına göre değil, karmaşık bir yapıya (Hash) göre tutulur.
- Benzersizdir (Unique): Aynı veri küme içerisine ikinci kez eklenemez.
1. HashSet Tanımlama ve Oluşturma
HashSet tanımlarken içeriği dolu veya boş olarak başlatabiliriz.
import 'dart:collection';
void main() {
// 1. İçeriği dolu HashSet oluşturma
var plaka = HashSet.from([06, 23, 41]);
// 2. Türü belirtilmiş boş HashSet oluşturma
var sehirler = HashSet<String>();
}2. Veri Ekleme (Add) ve Sıra Mantığı
Veri eklemek için add() metodunu kullanırız. Ancak burada dikkat etmeniz gereken nokta, verilerin çıktıdaki sırasıdır.
// Değer ekleme
sehirler.add("kocaeli");
sehirler.add("elazığ");
sehirler.add("ankara");
print(sehirler); // {elazığ, ankara, kocaeli}Veriler bizim eklediğimiz sırayla (kocaeli, elazığ, ankara) değil, kendi iç yapısına göre karışık bir sırayla listelendi.
Aynı Veriyi Tekrar Ekleme (Unique Özelliği)
HashSet’in diğerlerinden ayıran en temel özellik budur. Listede zaten var olan bir elemanı tekrar eklerseniz, HashSet bunu hata vermeden görmezden gelir.
// Aynı değeri ekleme
sehirler.add("ankara");
print(sehirler); // {elazığ, ankara, kocaeli} -> Değişiklik Yok!Büyük/Küçük Harf Duyarlılığı
Dart dilinde “ankara” ile “AnkArA” farklı veriler (String) olarak kabul edilir. Bu yüzden harf büyüklüğü farklı olan aynı kelime listeye eklenir.
sehirler.add("AnkArA");
print(sehirler); // {elazığ, AnkArA, ankara, kocaeli}3. Veri Okuma
HashSet’lerde index kavramı Listelerdeki gibi sabit değildir. Ancak yine de belirli bir sıradaki elemana erişmek istersek elementAt() metodunu kullanırız.
// Veri Okuma
String sehir = sehirler.elementAt(2);
print(sehir); // ankara4. HashSet Durum Kontrolleri (Boyut ve Boşluk)
Uygulama geliştirirken listenin dolu olup olmadığını veya kaç elemanı olduğunu sıkça kontrol etmemiz gerekir.
length: Eleman sayısını (boyutunu) verir.isEmpty: Boş isetrue, dolu isefalsedöner.isNotEmpty: Dolu isetruedöner.
print("Boyut : ${sehirler.length}"); // Boyut : 4
print("Boş kontrol : ${sehirler.isEmpty}"); // Boş kontrol : false
print("Boş kontrol : ${sehirler.isNotEmpty}"); // Boş kontrol : true5. Verileri Anlamlı Okuma
HashSet içerisindeki verileri kullanıcıya gösterirken ham haliyle ([a, b, c]) değil, işlenmiş haliyle sunarız. Bunun için döngüler kullanılır.
For-in Döngüsü (Pratik Yöntem)
// for each kullanarak liste içerisindeki verileri okuma
for(var sehir in sehirler){
print("Sonuç : ${sehir}");
}
// Program Çıktısı
/*
Sonuç : elazığ
Sonuç : AnkArA
Sonuç : ankara
Sonuç : kocaeli
*/Standart For Döngüsü (Index Tabanlı)
Eğer index numarasına ihtiyacınız varsa elementAt ile birlikte standart for döngüsü kurulabilir.
// İndex değerine göre liste elemanlarını ekrana yazdırır
for(var i=0; i<sehirler.length; i++){
print("$i. -> ${sehirler.elementAt(i)}");
}
// Program Çıktısı
/*
0. -> elazığ
1. -> AnkArA
2. -> ankara
3. -> kocaeli
*/6. Veri Silme İşlemleri
HashSet’ten veri silerken, Listelerin aksine index numarasıyla değil, doğrudan verinin kendisiyle (Value) silme işlemi yaparız.
remove()
Belirtilen nesneyi bulur ve siler.
sehirler.remove("AnkArA");
print(sehirler); // {elazığ, ankara, kocaeli} -> AnkArA silindiclear()
Tüm kümeyi temizler.
sehirler.clear();
print(sehirler); // {}Sonuç
Eğer verilerinizin sırası önemliyse ve aynı elemandan birden fazla kaydetmeniz gerekiyorsa List yapısından vazgeçmeyin. Ancak, “bu listede aynı veriden sadece bir tane olmalı” dediğiniz bir senaryonuz varsa (örneğin; favoriye eklenen ürün id’leri veya benzersiz plaka kodları), HashSet kullanmak sizi manuel kontrol yapma zahmetinden kurtaracak ve kodunuzun çok daha performanslı çalışmasını sağlayacaktır.