Programların çoğunda birden fazla aynı tipte değişkenlere ihtiyaç duyarız.
Bu sorunun çözümü olarak birçok dilde kullanılan veri yapıları ,dizilerdir.
Bildiğimiz klasik dizilerin programlama tekniklerine getirdikleri kolaylıkların
dışında birtakım kısıtlamaları da vardır. Bu makalede klasik dizilerde sık sık
karşılaştığımız çeşitli sorunları ve bu sorunları nasıl çözebileceğimizi
inceleyeceğiz.
.NET platformunun sınıf kitaplıklarında bulunan ve programcıların işlerini
çok kolaylaştıran ArrayList sınıfı ile klasik dizilerde karşılaştığımız
sorunları nasıl çözeceğimizi göreceğiz.
Klasik dizilerle çalışırken karşılaşabileceğimiz temel sorunları şu şekilde
sıralamak mümkündür:
·
Dizilerin sınırları sabittir.
·
Dizilerin tüm elemanları aynı türden olmalıdır.
·
Kullanmadığımız dizi elemanlarından dolayı bellek alanları gereksiz yere
işgal edilmektedir.
Örneğin sayısını bilemediğimiz bir dizinin eleman sayısını 500 olarak
belirlediğimizi varsayalım. Çalışma zamanında dizimizin sadece 10 elamanını
kullandığımız durumda diğer 490 elemanlık bellek alanı boş olarak kalır. Öte
yandan dizimizde tutmak istediğimiz değişkenlerin sayısı 501 bir olduğu bir
durumda "IndexOutOfRangeException" istisnai durumu ortaya çıkar ve
program bu hatadan dolayı sonlanır.
Mesela aşağıdaki kodu derlemeye çalışalım:
using System;
class CshaprNedirCom
{
static void Main(string[] args)
{
int[] intDizi= new int[10];
{
static void Main(string[] args)
{
int[] intDizi= new int[10];
try
{
intDizi[20]=5;
}
catch( Exception e)
{
Console.WriteLine(e.GetType());
}
Console.ReadLine();
{
intDizi[20]=5;
}
catch( Exception e)
{
Console.WriteLine(e.GetType());
}
Console.ReadLine();
}
}
Yukarıdaki programda intDizi 'mizi 10 eleman alacak şekilde tanımlamamıza rağmen bu
dizinin 20. elemanına ulaşıp ona birşeyler atamaya çalıştık. Bu durumda programımız
çalışırken hata verdi. Çünkü dizinin sınırları bellidir ve bu sınırların dışına
çıkamıyoruz. Eleman sayısı ihtiyacımıza göre değişen bir veri yapısı olması
gerçekten hoş olmaz mıydı? Evet C#'da böyle bir dizi yapımız var. Bunun ismi
ArrayList'tir.
ArrayList sınırları dinamik olarak değişebilen diziler olarak tanımlanır.
Bu veri yapısı .NET sınıf kütüphanesinin System.Collections isim alanında
bulunur. İsterseniz ArrayList'i nasıl kullanacağımızı bir örnekle inceleyelim:
using System;
using System.Collections; // ArrayList sınıfnı kullanmak için
// System.Collection isimalanını eklemeliyiz..
using System.Collections; // ArrayList sınıfnı kullanmak için
// System.Collection isimalanını eklemeliyiz..
class CshaprNedirCom
{
static void Main(string[] args)
{
ArrayList aList= new ArrayList(); // aList isimli ArrayList nesnesi oluşturalım.
{
static void Main(string[] args)
{
ArrayList aList= new ArrayList(); // aList isimli ArrayList nesnesi oluşturalım.
// aList nesnemize sırası ile 5, 8, 1, 17 ve 20 değerlerini
// Add metodu ile ekleyelim.
aList.Add(5);
aList.Add(8);
aList.Add(1);
aList.Add(17);
aList.Add(20);
// Add metodu ile ekleyelim.
aList.Add(5);
aList.Add(8);
aList.Add(1);
aList.Add(17);
aList.Add(20);
// aList'in elemanlarını ekrana yazdıryoruz:
Console.WriteLine("\t aList'in elemanları:");
foreach(int eleman in aList)
Console.WriteLine(eleman);
Console.WriteLine("\t aList'in elemanları:");
foreach(int eleman in aList)
Console.WriteLine(eleman);
// aList dizimizden 8 ve 20 değerlerini çıkartalım:
aList.Remove(8);
aList.Remove(20);
// aList dizimize 66 ve 4 değerlerini ekleyelim:
aList.Add(66);
aList.Add(4);
aList.Remove(8);
aList.Remove(20);
// aList dizimize 66 ve 4 değerlerini ekleyelim:
aList.Add(66);
aList.Add(4);
Console.WriteLine("\n\t aList dizisinden 8 ve
20\' çıkartıp, 66 ve 4 ekledik:");
foreach(int eleman in aList)
Console.WriteLine(eleman);
foreach(int eleman in aList)
Console.WriteLine(eleman);
Console.ReadLine();
}
}
}
Yukarıdaki örneğimizde öncelikle ArrayList sınıfını kullanmak için NET sınıf
kütüphanesinin System.Collections isim alanınını kullanacağımızı using System.Collections; ile
bildiriyoruz. Main fonksiyonumuzun içindeki ilk satırda, ArrayList aList= new ArrayList() , aList ismini verdiğimiz ArrayList sınıfından bir nesne
oluşturuyoruz. aList nesnemizi oluşturduğunuz satırdan sonraki beş satırda
ArrayList sınıfının Add() metodu ile aList adlı dizimize elemanları ekliyoruz.
Daha sonra aList diziminizin elemanlarını ForEach döngüsü ile
tek tek ekrana yazdıyoruz. ArrayList sınıfındaki bir nesnenin elemanlarını tek
tek silmek için Remove() metodunu kullanırız. Remove() metodu ile istediğimiz
elemanı diziden atabiliriz. Biz de 8 ve 20 elemanlarını diziden attık. Son
olarak dizimize 66 ve 20 elemanlarını ekleyip dizinin son halini ekrana yazdırdık.
C# dilinde normal diziler bildiğiniz gibi sadece aynı
tipten verileri tutar. Ama ArrayList sınıfına ait dizilerimiz her türlü nesneyi
aynı dizi içinde tutabilir. Yani aynı dizide int, float, ve string tiplerindeki
değişkenleri depolama şansımız var. Mesela aşağıdaki kod C# dili kuralları
çerçevesinde geçerli bir koddur:
ArrayList karmaList= new ArrayList(); // karmaList
isimli ArrayList nesnesi oluşturalım.
karmaList.Add("Ahmet");
karmaList.Add(12);
karmaList.Add(true);
karmaList.Add(32.4f);
karmaList.Add('c');
karmaList.Add(12);
karmaList.Add(true);
karmaList.Add(32.4f);
karmaList.Add('c');
Bu kod ile karmaList isimli ArrayList nesnemizin
içinde string, int, bool, float ve char tiplerinden oluşan verileri aynı anda
saklarız. ArrayList sınıfının bize sunduğu diğer bir güzel özellik ise tek bir
komut ile ArrayList dizimizin içerisindeki elemanları ters çevirebilmemizdir.
Ters çevirme işlemi için Reverse() metodu kullanılır. İsterseniz Reverse()
metodunu ve ArrayList'lerde nasıl birden farklı türdeki elemanları kullanacağımızı
bir örnekle inceleyelim:
using System;
using System.Collections; // ArrayList sınıfnı kullanmak için
// System.Collection isimalanını eklemeliyiz..
using System.Collections; // ArrayList sınıfnı kullanmak için
// System.Collection isimalanını eklemeliyiz..
class CshaprNedirCom
{
static void Main(string[] args)
{
// karmaList isimli ArrayList nesnesi oluşturalım.
ArrayList karmaList= new ArrayList();
// karmaList'e değişik tipte elemanlar ekliyoruz.
karmaList.Add("Ali");
karmaList.Add(23);
karmaList.Add(false);
karmaList.Add(52.8d);
karmaList.Add('r');
{
static void Main(string[] args)
{
// karmaList isimli ArrayList nesnesi oluşturalım.
ArrayList karmaList= new ArrayList();
// karmaList'e değişik tipte elemanlar ekliyoruz.
karmaList.Add("Ali");
karmaList.Add(23);
karmaList.Add(false);
karmaList.Add(52.8d);
karmaList.Add('r');
// karmaList'in elemanlarını ekrana yazdırıyoruz:
Console.WriteLine("\t karmaList'in elemanları:");
foreach(object eleman in karmaList)
Console.WriteLine(eleman);
Console.WriteLine("\t karmaList'in elemanları:");
foreach(object eleman in karmaList)
Console.WriteLine(eleman);
karmaList.Reverse(); // karmaList'imizi ters
çeviriyoruz.
Console.WriteLine("\n ---> karmaList'in
elemanları ve türleri <---");
foreach(object eleman in karmaList)
Console.WriteLine("Türü: {0,15} değeri: {1,7}",eleman.GetType(), eleman);
foreach(object eleman in karmaList)
Console.WriteLine("Türü: {0,15} değeri: {1,7}",eleman.GetType(), eleman);
Console.ReadLine();
}
}
}
}
Yukarıdaki programda karmaList isimli ArrayList sınfından
bir nesne oluşturduktan sonra onu değişik türlerden veriler ile doldurduk. Bu
dizinin elemanlarını sıra ile foreach döngüsü yardımıyla ekrana yazdırdık. karmaList.Reverse()
satırında ise
dizimizi ters çevirdik. Son işimizde ise karmaList dizisinin elemanlarını
ekrana tek tek yazdırırken aynı zamanda eleman.GetType( ) her elemanın
türünü bulup yazdık.
Hiç yorum yok:
Yorum Gönder