| Editor Login | Register | ||
| > Akademik İnternet ® > .Net FrameWork |
|
|
| Hashtable Sınıfı | ||||||
Hashtable da System.Collections namespace’inde bulunan diğer sınıflar gibi kendi ismi ile anılan veri yapısı ve algoritmayı enkapsüle eder. Hashtable sınıfının detaylarına geçmeden önce, bu veri yapısı üzerinde kısaca durmanın konuyu anlamak bakımından yararlı olacağını düşünüyorum. NOT : Hashtable veri yapısı ya da “hashing” algoritmaları, üzerine onlarca kitap yazılmış ve başlı başlına incelenmesi gereken detaylı bir konudur. Burada yapılmak istenen, konuya ilişkin temel bilgilerin detaya inilmeksizin okuyucuya kazandırılmasıdır. Hashtable veri yapısında, elemanlar özgün birer “anahtar-değer çifti” şeklinde bellekte saklanırlar. Terminolojide anahtar-değer çiftlerinin saklandığı yapı; “hash tablosu” olarak bilinir. Hash tablosuna yeni bir eleman eklendiği zaman, anahtar bilgisinden özel bir algoritma ile hash kodu elde edilir. Hash kodunun elde edilişi, “hash fonksiyonu” ile sağlanır. Sofistike olmayan durumlar için, hash fonksiyonun çalışma prensibi; tablo büyüklüğü ile uygulanan mod alma işlemidir. Bu işlem sonucunda elde edilen değer, anahtar bilgisinin indisi olacaktır. Örneğin beş elemanlı tabloya eklenen (1, 2, 64) anahtar değerleri için;
Bu durumda hash fonksiyonunun genel biçimi; “h(key) = key mod size” şeklindedir. Hashtable sınıfı, anahtar bilgisi olarak herhangi bir nesnenin kullanımına imkan tanır. Aslında fiziksel olarak, Hashtable sınıfı ile oluşturulan veri yapısı; DictionaryEntry yapısı türünden nesneleri saklar. Bu durumda Hashtable sınıfı ile oluşturulan veri yapısını görsel olarak şöyle gösterebiliriz;
Hashtable sınıfı , anahtara ait hash kodu bilgisini anahtar olarak kullanılan nesnenin GetHashCode() fonksiyonundan sağlar. Bildiğiniz gibi, .NET Framework’teki her nesne, object sınıfından türetilmiştir ve GetHashCode() fonksiyonunu miras alır. Hashtable veri yapısına ait bilindik bir sorun çakışmalardır (collision). Çakışma, birden fazla anahtarın, tablodaki aynı hücre ile ilişkilendirilmesi durumunda oluşur. Hashtable sınıfı, bu sorunu belirli bir ölçüde önlemek amacıyla, “double hashing” algoritmasını kullanır. Ancak bazı durumlarda çakışmaların önüne tümüyle geçilemez. Hashtable veri yapısınının performans optimizasyonu üzerinde iki faktör etkilidir; tablo büyüklüğü ve anahtar olarak kullanılan nesneden elde edilen hash kod bilgisinin tekilliği. Bu nedenle, tablonun oluşturulması aşamasında doğru büyüklüğün belirlenmesi önemlidir. Her ne kadar Hashtable’ın büyüklüğü otomatik artım yeteneğine sahipse de, bu tür işlemlerin yapılışı belirli bir zaman almaktadır. Oluşturulan Hashtable’ın, performans ve bellek tüketimi karakteristiklerinin dengelenmesinde, yükleme faktörünün (load factor) doğru seçilmiş olması da önemli bir unsurdur. Yükleme faktörü, tablodaki geçerli eleman sayısının, tablo büyüklüğüne oranı olarak tanımlanabilir. Varsayılan değeri (1.0) olan yükleme faktörüne (0.1 – 1.0) aralığında değerler verilerek, hız ve bellek tüketimi dengelenebilir. Ancak standart uygulamalar için, default değerinin kullanımı önerilmektedir. < /P > Hashtable Yapısının Oluşturulması Bellekte Hashtable yapısında ve uygun büyüklükte bir bölgenin tahsisi, Hashtable sınıfına ait constructor’ın kullanımı sayesinde, nesne yaratılması sırasında otomatik olarak sağlanır. Hashtable sınıfında onbir farklı overload versiyonu bulunan constructor vardır, ancak burada en sık kullanılan versiyonlar üzerinde durulmuştur. Public Sub New() Bu versiyon kullanılarak türetilen bir Hashtable nesnesi, bellekte default olarak belirlenmiş büyüklük (0 eleman) ve yükleme faktörüne (1.0), sahip bir Hashtable yapısını oluşturur. Public Sub New(ByVal capacity as Integer) Bu versiyon kullanılarak türetilen bir Hashtable nesnesi, bellekte fonksiyonun parametresinde belirlenen büyüklükte bir Hashtable yapısını oluşturur. Public Sub New(ByVal d as IDictionary) Bu versiyon kullanılarak türetilen bir Hashtable nesnesi, fonksiyonun parametresinde belirlenen kolleksiyonun elemanlarını kopyalarak, bir Hashtable yapısı oluşturur. Hashtable Yapısı Üzerinde İşlemler Hashtable yapısı üzerinde eleman ekleme, silme, bulma gibi işlemler; Hashtable sınıfına ait üyeler kullanılarak gerçekleştirilir. Count Propertysi : Hashtable’ın eleman sayısını tutar. Public Overridable Property Count As Integer Implements ICollection.CountItem Property’si : Parametresine anahtar bilgisi girilen elemanı temsil eder. Set ve Get işlemlerinde kullanılır. Default Public Overridable Property Item(ByVal key As Object) As Object Keys Property’si : Bu property Hashtable içerisindeki anahtar bilgilerini içeren, ICollection türündeki bir kolleksiyondur. Public Overridable ReadOnly Property Keys As ICollection Values Property’si : Bu property Hashtable içerisindeki değer bilgilerini içeren, ICollection türündeki bir kolleksiyondur. Public Overridable ReadOnly Property Values As ICollection Add() Metodu : Parametresine anahtar ve değer bilgileri girilen elemanı tabloya ekler. Eklenen eleman için, anahtar bilgisi kesinlikle null referans olamaz, ancak değer null olabilir. Hashtable’a null referans içeren bir anahtarın eklenmesi, ArgumentNullException oluşmasına neden olur. Ayrıca belirlenen anahtar bilgisinin tablo içerisinde önceden bulunmaması ve tekil olması gerekir. Hashtable’a daha önceden eklenmiş bir anahtarın tekrar eklenmesi, ArgumentException oluşmasına neden olur. Public Overridable Sub Add( _ ByVal key as Object, ByVal value as Object Sabit uzunluktaki ya da salt okunur Hashtable yapıları için Add() metodunun kullanımı NotSupportedException oluşmasına neden olur. Remove() Metodu : Parametresine anahtar bilgisi girilen elemanı Hashtable’dan çıkartır. Public Overridable Sub Remove( _ ByVal key as Object,) Implements IDictionary.Remove Sabit uzunluktaki ya da salt okunur Hashtable yapıları için Remove() metodunun kullanımı NotSupportedException oluşmasına neden olur. Contains() Metodu : Parametresine anahtar bilgisi girilen elemanı, Hashtable içerisinde arar. Fonksiyon aradığı elemanı tabloda bulursa true ile, bulamazsa false değeri ile döner. Public Overridable Function Contains( ByVal key as Object) as Boolean
ContainsKey() Metodu : Parametresine anahtar bilgisi girilen elemanı, Hashtable içerisinde arar. Fonksiyon aradığı elemanı tabloda bulursa true ile, bulamazsa false değeri ile döner. Public Overridable Function ContainsKey( ByVal key as Object) as Boolean ContainsValue() Metodu : Parametresine değer bilgisi girilen elemanı, Hashtable içerisinde arar. Fonksiyon aradığı elemanı tabloda bulursa true ile, bulamazsa false değeri ile döner. Public Overridable Function ContainsValue( ByVal value as Object) as Boolean Clear() Metodu: HashTable’ın içeriğini tamamen yok eder. Public Overridable Sub Clear() Implements IDictionary.Clear Örnek : Aşağıdaki uygulamada haftanın günleri türkçe ve ingilizce olarak “oHtb” isimli nesne ile temsil edilen Hastable’a eklenmiştir. Daha sonra Item property’si kullanılarak, anahtar bilgisi girilen elemanın değer bilgisinin alınışı örneklenmiştir.
Sub Main() Dim oHtb As Hashtable oHtb = New Hashtable(7) oHtb.Add("Pazartesi", "Monday") oHtb.Add("Salı", "Tuesday") oHtb.Add("Çarşamba", "Wednesday") oHtb.Add("Perşembe", "Thursday") oHtb.Add("Cuma", "Friday") oHtb.Add("Cumartesi", "Saturday") oHtb.Add("Pazar", "Sunday")
Console.WriteLine("Salının ingilizcesi:" & oHtb.Item("Salı")) End Sub |
|
| Bağlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |