nesne tabanlı programlama diziler / stajyerolarak: Diziler ve Koleksiyonlar Kullanmak

Nesne Tabanlı Programlama Diziler

nesne tabanlı programlama diziler

Yazan : Şadi Evren ŞEKER

Bu yazının amacı, nesne yönelimli programlama konusu altında, sıklıkla geçen nesne dizilerini (object array) anlatmaktır. Kısaca bir dizinin elemanlarına nesne atamanın nasıl olacağı anlatılacaktır.

Öncelikle nesne yönelimli programlama dillerinde, kullanılan nesne atıflarının (object referrer) birer gösterici (pointer) olduklarını bilmemiz gerekir.

Örnek olarak bir sınıf tanımı ile başlayalım:

class insan{ int yas; String isim; }

Şimdi yukarıdaki sınıftan üretilen bir nesneyi ele alalım:

insan ali = new insan();

Burada ali ismi ile geçen değişken (variable) bir nesne atıfıdır (object referrer) ve insan sınıfından yeni bir nesne üretilmiş, ve bu nesne gösterilmiştir.

Ayırca JAVA dilindeki dizi tanımlamasını da hatırlatalım:

int x[] = new int[5];

Yukarıdaki tanım ile, bir int dizisi tanımlanmıştır. Bu dizinin kendisi de aslında bir nesnedir ve kendisine özgü bazı fonksiyon ve özellikleri bulunur. Ancak konumuz kapsamında 5 elemanlı (0’dan başlayarak 4’e kadar giden (0 ve 4 dahil)) elemanları olduğunu ve int tipinde tanılmandığı için her elemanına birer tam sayı konulabilen (int) bir dizi (array) olduğunu söylememiz yeterlidir.

Artın hatırladığımız dizi tanımı ile nesne tanımını birleştirebiliriz:

insan x[] = new insan[5];

Elemanlarının her biri birer nesne atıfı olan bir dizi tanımlanmıştır. Buna göre dizinin her elemanına, insan tipinden bir nesne göstericisi konulabilir.

Ancak nesne göstericileri için geçerli olan kurallar burada da geçerlidir. Örneğin yukarıdaki tanımdan hemen sonra aşağıdaki gibi bir kullanım hata verecektir:

x[2].yas = 20;

Buradaki hatanın sebebi henüz üretilmemiş olan bir nesnenin bir özelliğine erişiliyor olmasıdır. x[2] ile gösterilen dizinin RAM’de henüz kapladığı yer belirtilmemiş ve dolayısıyla bu alana erişime izin verilmemiştir. Çözüm olarak önce new komutu ile hafızada bu nesnenin yaşayacağı alan tanıtılmalıdır.

x[2] = new insan();

Ancak yukarıdaki şekilde bir tanımlamadan sonra bir önceki adımda hata veren satırı yazıp çalıştırabiliriz.

JAVA dilinde ayrıca for dizilerinin özel bir kullanımı aşağıdaki şekildedir:

for(insan i : x)

Yukarıdaki kod satırı, x dizisinin eleman sayısı kadar döner. Örneğin dizimiz 10 elemanlı ise, döngü 0’dan 9’a kadar dönecek ve her dönüşünde ilgili eleman değerini i isimli nesne göstericisine atayacaktır.

Yukarıda anlatılan bilgiler ışığında, derste yazdığım bir kodu aşağıda yayınlıyorum:

class insan{ int yas; String isim; public String toString(){ return "yas: "+yas+" isim: "+isim; } }

Yukarıdaki kodda, bir insan sınıfı tanımlanmıştır. Bu tanıma göre insanın yaşı ve ismi bulunmaktadır. Ayırca toString ismi verilen özel bir fonksiyon yazılmıştır. Bu fonksiyonun amacı, bu sınıftan (class) üretilen bir nesnenin (object), dizgiye (string) çevrilmesi durumunda otomatik olarak çalışıyor olmasıdır. Aslında bu fonksiyon, her nesne (object) için otomatik olarak tanımlıdır. Bunun sebebi java.lang.Object sınıfında tanımlı bir fonksiyon olmasıdır ve bu fonksiyon her sınıf tanımında ezilebilir (override). Örnek kodumuzda da üzerine yükleme (override) işlemi yapılmış ve fonksiyon ezilmiştir. Böylece insan sınıfından bir nesne, dizgi olarak kullanıldığında fonksiyonda belirtildiği üzere “yas: “ yazısına insanın yaşı eklenecek ardından “isim:” yazısının ardında insanın ismi eklenerek döndürülecektir.

Test amacıyla yazılmış örnek bir kod aşağıda verilmiştir:

public static void main(String args[]){ insan i[]; i = new insan[5]; insan ali = new insan(); ali.e = x; ali.yas = 20; ali.isim= "ali yilmaz"; System.out.println(" alinin adresi : "+ ali.e.adres); i[0] = ali; i[1] = new insan(); i[1].yas = 30; i[1].isim = "veli demir"; System.out.println("i[0]:" +i[0] ); i[2] = new insan(); i[3] = new insan(); i[4] = new insan(); i[2].isim = "ahmet yildiz"; i[3].isim = "veli yilmaz"; i[4].isim = "cem yildiz"; for(int j=0;j<i.length;j++){ i[j].yas =10+ (int)( Math.random() * 40); } for(insan in : i){ System.out.println(in.toString()); } }

Yukarıdaki kodda örnek olarak 5 elemanlı bir insan dizisi oluşturulmuştur. Bu diziye önce ali isimli bir nesne göstericisinin içerisine atanan nesne yerleştirilmiş ( dizinin 0. sırasına) ardından dizinin 1. elemanı için yeni bir nesne oluşturulmuştur. Son olarak dizinin 3., 4. ve 5. elemanları için arka arkaya nesne oluşturulmuş (hafızada yer açılmış) ve isim ataması yapılmıştır. Kodun bundan sonraki kısmında bir döngü ile dizideki bütün insanlara rast gele yaş ataması yapılmıştır (random fonksiyonu) ve ikinci bir döngü ile insanlar ekrana bastırılmıştır. Buradaki bastırma işlemi sırasında insanlar daha önceden tanımlı olan toString fonksiyonu marifetiyle önce dizgiye (string) çevrilmiş ve ardından ekrana bastırılmıştır.

 

Koleksiyonlar (C#)

Birçok uygulama için ilgili nesne gruplarını oluşturmak ve yönetmek istiyorsunuz. Nesneleri gruplandırmanın iki yolu vardır: nesne dizileri oluşturarak ve nesne koleksiyonları oluşturarak.

Diziler en çok sabit sayıda kesin türü belirlenmiş nesne oluşturmak ve bunlarla çalışmak için kullanışlıdır. Diziler hakkında bilgi için bkz. Diziler.

Koleksiyonlar, nesne gruplarıyla çalışmak için daha esnek bir yol sağlar. Dizilerden farklı olarak, birlikte çalıştığınız nesne grubu, uygulamanın gereksinimleri değiştikçe dinamik olarak büyüyebilir ve küçülebilir. Bazı koleksiyonlar için, anahtarı kullanarak nesneyi hızlı bir şekilde alabilmeniz için koleksiyona yerleştirdiğiniz herhangi bir nesneye anahtar atayabilirsiniz.

Koleksiyon bir sınıftır, bu nedenle bu koleksiyona öğe ekleyebilmeniz için önce sınıfın bir örneğini bildirmeniz gerekir.

Koleksiyonunuz yalnızca bir veri türünde öğeler içeriyorsa, ad alanındaki System.Collections.Generic sınıflardan birini kullanabilirsiniz. Genel koleksiyon, tür güvenliğini zorlar, böylece başka veri türü eklenemez. Bir öğeyi genel bir koleksiyondan aldığınızda, veri türünü belirlemeniz veya dönüştürmeniz gerekmez.

Not

Bu konudaki örnekler için ve ad alanları için kullanma yönergelerini içerir.

Bu konuda

Basit Koleksiyon Kullanma

Bu bölümdeki örneklerde, kesin olarak belirlenmiş bir nesne listesiyle çalışmanızı sağlayan genel List<T> sınıfı kullanılır.

Aşağıdaki örnek bir dize listesi oluşturur ve ardından bir foreach deyimi kullanarak dizeler arasında yinelenir.

Bir koleksiyonun içeriği önceden biliniyorsa, koleksiyonu başlatmak için bir koleksiyon başlatıcı kullanabilirsiniz. Daha fazla bilgi için bkz . Nesne ve Koleksiyon Başlatıcıları.

Koleksiyona öğe eklemek için bir koleksiyon başlatıcısı kullanılması dışında, aşağıdaki örnek önceki örnekle aynıdır.

Koleksiyonda yineleme yapmak için deyimi yerine for deyimini kullanabilirsiniz. Bunu, dizin konumuna göre koleksiyon öğelerine erişerek gerçekleştirirsiniz. Öğelerin dizini 0'dan başlar ve öğe sayısı eksi 1'de biter.

Aşağıdaki örnek yerine kullanarak bir koleksiyonun öğelerinde yinelenir.

Aşağıdaki örnek kaldırılacak nesneyi belirterek bir öğeyi koleksiyondan kaldırır.

Aşağıdaki örnek, öğeleri genel bir listeden kaldırır. Deyimi yerine azalan sırada yineleyen bir deyim kullanılır. Bunun nedeni, yöntemin RemoveAt kaldırılan bir öğeden sonraki öğelerin daha düşük bir dizin değerine sahip olmasına neden olmasıdır.

içindeki List<T>öğelerin türü için kendi sınıfınızı da tanımlayabilirsiniz. Aşağıdaki örnekte, tarafından List<T> kullanılan sınıfı kodda tanımlanmıştır.

Koleksiyon Türleri

Birçok yaygın koleksiyon .NET tarafından sağlanır. Her koleksiyon türü belirli bir amaç için tasarlanmıştır.

Yaygın koleksiyon sınıflarından bazıları bu bölümde açıklanmıştır:

System.Collections.Generic Sınıfları

Ad alanında sınıflardan System.Collections.Generic birini kullanarak genel bir koleksiyon oluşturabilirsiniz. Genel koleksiyon, koleksiyondaki her öğe aynı veri türüne sahip olduğunda kullanışlıdır. Genel koleksiyon, yalnızca istenen veri türünün eklenmesine izin vererek güçlü yazma uygular.

Aşağıdaki tabloda ad alanının sık kullanılan sınıflarından bazıları listelenmektedir System.Collections.Generic :

Ek bilgi için bkz . Yaygın Olarak Kullanılan Koleksiyon Türleri, Koleksiyon Sınıfı Seçme ve System.Collections.Generic.

System.Collections.Concurrent Sınıfları

.NET Framework 4 ve sonraki sürümlerde, ad alanında System.Collections.Concurrent koleksiyonlar birden çok iş parçacığından koleksiyon öğelerine erişmek için verimli iş parçacığı güvenli işlemler sağlar.

Koleksiyona System.Collections.Concurrent aynı anda birden çok iş parçacığı eriştiğinde System.Collections.Generic ad alanında karşılık gelen türler yerine ve System.Collections ad alanları içindeki sınıflar kullanılmalıdır. Daha fazla bilgi için bkz . İş Parçacığı Güvenli Koleksiyonlar ve System.Collections.Concurrent.

Ad alanına dahil edilen System.Collections.Concurrent bazı sınıflar , ConcurrentDictionary<TKey,TValue>, ConcurrentQueue<T>ve ConcurrentStack<T>sınıflarıdırBlockingCollection<T>.

System.Collections Sınıfları

Ad alanındaki System.Collections sınıflar öğeleri özel olarak yazılan nesneler olarak değil, türündeki nesneler olarak depolar.

Mümkün olduğunda, ad alanında System.Collections.Generic eski türler yerine ad alanında veya System.Collections.Concurrent ad alanında genel koleksiyonları kullanmanız gerekir.

Aşağıdaki tabloda ad alanında sık kullanılan sınıflardan bazıları listelenmektedir :

SınıfAçıklama
ArrayListBoyutu gerektiği gibi dinamik olarak artan bir nesne dizisini temsil eder.
HashtableAnahtarın karma koduna göre düzenlenmiş bir anahtar/değer çiftleri koleksiyonunu temsil eder.
QueueNesnelerin ilk in, first out (FIFO) koleksiyonunu temsil eder.
StackNesnelerin son gelen ilk çıkışı (LIFO) koleksiyonunu temsil eder.

Ad System.Collections.Specialized alanı, yalnızca dize koleksiyonları, bağlı liste ve karma sözlükler gibi özelleştirilmiş ve kesin olarak belirlenmiş koleksiyon sınıfları sağlar.

Anahtar/Değer Çiftleri Koleksiyonu Uygulama

Genel Dictionary<TKey,TValue> koleksiyon, her öğenin anahtarını kullanarak koleksiyondaki öğelere erişmenizi sağlar. Sözlüğe yapılan her ekleme bir değerden ve ilişkili anahtarından oluşur. sınıfı karma tablo olarak uygulandığından, anahtarını kullanarak bir değerin alınması hızlıdır.

Aşağıdaki örnek bir koleksiyon oluşturur ve deyimini kullanarak sözlükte yinelenir.

Bunun yerine koleksiyonu derlemek için bir koleksiyon başlatıcı kullanmak için ve yöntemlerini aşağıdaki yöntemle değiştirebilirsiniz.

Aşağıdaki örnek, bir öğeyi anahtara ContainsKey göre hızlı bir şekilde bulmak için yöntemini ve Item[] özelliğini kullanır. özelliği, C# dilinde kullanarak koleksiyondaki bir öğeye erişmenizi sağlar.

Aşağıdaki örnek bunun yerine bir öğeyi anahtara TryGetValue göre hızlı bir şekilde bulma yöntemini kullanır.

Koleksiyona Erişmek için LINQ Kullanma

LINQ (Language-Integrated Query) koleksiyonlara erişmek için kullanılabilir. LINQ sorguları filtreleme, sıralama ve gruplandırma özellikleri sağlar. Daha fazla bilgi için bkz. C# dilinde LINQ kullanmaya başlama.

Aşağıdaki örnek, genel bir üzerinde bir LINQ sorgusu çalıştırır. LINQ sorgusu sonuçları içeren farklı bir koleksiyon döndürür.

Koleksiyonu Sıralama

Aşağıdaki örnekte bir koleksiyonu sıralama yordamı gösterilmektedir. Örnek, sınıfının bir List<T>içinde depolanan örneklerini sıralar. sınıfı, yönteminin IComparable<T> uygulanmasını gerektiren arabirimini CompareTo uygular.

yöntemine yapılan CompareTo her çağrı, sıralama için kullanılan tek bir karşılaştırma yapar. yöntemindeki kullanıcı tarafından yazılan kod, geçerli nesnenin başka bir nesneyle her karşılaştırması için bir değer döndürür. Geçerli nesne diğer nesneden küçükse döndürülen değer sıfırdan küçük, geçerli nesne diğer nesneden büyükse sıfırdan büyük ve eşitse sıfır. Bu, kodda büyüktür, küçüktür ve eşittir ölçütlerini tanımlamanızı sağlar.

yönteminde deyimi listeyi sıralar. yöntemine yapılan Sort bu çağrı, yönteminin List<T> içindeki nesneler için otomatik olarak çağrılmaya neden olur.

Özel Koleksiyon Tanımlama

veya IEnumerable arabirimini IEnumerable<T> uygulayarak bir koleksiyon tanımlayabilirsiniz.

Özel bir koleksiyon tanımlayabilmenize rağmen, bunun yerine bu makalenin önceki bölümlerinde yer alan Koleksiyon Türleri bölümünde açıklanan .NET'te yer alan koleksiyonları kullanmak genellikle daha iyidir.

Aşağıdaki örnek adlı özel bir koleksiyon sınıfı tanımlar. Bu sınıf, yönteminin IEnumerable uygulanmasını gerektiren arabirimini GetEnumerator uygular.

yöntemi sınıfının bir örneğini döndürür. özelliğinin IEnumeratorMoveNext, yönteminin ve Reset yönteminin Current uygulanmasını gerektiren arabirimini uygular.

Yineleyiciler

Yineleyici, bir koleksiyon üzerinde özel yineleme gerçekleştirmek için kullanılır. Yineleyici bir yöntem veya erişimci olabilir. Yineleyici, koleksiyonun her bir öğesini birer birer döndürmek için bir yield return deyimi kullanır.

Bir foreach deyimi kullanarak yineleyici çağırırsınız. Döngünün her yinelemesi yineleyiciyi çağırır. Yineleyicide bir deyime ulaşıldığında, bir ifade döndürülür ve koddaki geçerli konum korunur. Yineleyici bir sonraki çağrılışında yürütme bu konumdan yeniden başlatılır.

Daha fazla bilgi için bkz. Yineleyiciler (C#).

Aşağıdaki örnek bir yineleyici yöntemi kullanır. Yineleyici yöntemi bir döngü içinde bir deyimine sahiptir. yönteminde , deyim gövdesinin her yinelemesi bir sonraki deyime devam eden yineleyici yöntemine bir çağrı oluşturur.

Ayrıca bkz.

NESNE TABANLI PROGRAMLAMADA DİZİ DEĞİŞKENLER VE KOLEKSİYONLAR EĞİTİMİ

Nesne Tabanlı Programlamada Dizi Değişkenler ve Koleksiyonlar Eğitimi

Nesne Tabanlı Programlamada Dizi Değişkenler ve Koleksiyonlar Eğitimi: Programlama yaparken dizi değişkenler ve koleksiyonlar ile çalışma yetisinin kazandırılmaya çalışıldığı bir eğitim materyalidir.

Nesne tabanlı programlamada dizi değişkenler ve koleksiyonlar eğitimi verilmesinin temel amacı dizileri ve koleksiyonları anlayıp uygulamalarınızda kullanabilmenizdir. Nesne tabanlı programlamada dizi değişkenler ve koleksiyonlar eğitimi tamamlandığında dizileri, koleksiyon sınıflarını ve parametreleri kullanabilirsiniz.

Eğitim İçeriği

1. Nesne Tabanlı Programlamada Dizi Değişkenler ve Koleksiyonlar Eğitimi - Dizile İle Çalışmak

1.1. Dizi Oluşturmak

1.2. Diziye Değer Atanması

1.3. Dizi Elemanlarına Erişim

1.4. foreach Döngüsü Kullanımı

1.5. Diziyi Kopyalamak

2. Nesne Tabanlı Programlamada Dizi Değişkenler ve Koleksiyonlar - Koleksiyonlar İle Çalışmak

2.1. Koleksiyon (System.Collections) Sınıflarını Kullanmak

  • ArrayList Sınıfı
  • Yığınlar ve Kuyruklar
  • Hashtable Sınıfı
  • SortedList Sınıfı

2.2. Koleksiyon Başlatma İşlemi

3. Nesne Tabanlı Programlamada Dizi Değişkenler ve Koleksiyonlar - Parametre Dizileri İle Çalışmak

3.1. Diziye Ait Bağımsız Değişkenler

  • “params” Dizilerini Tanımlamak
  • (params object[] list)

3.2. “params” Dizisi İle Çalışmak

nest...

oksabron ne için kullanılır patates yardımı başvurusu adana yüzme ihtisas spor kulübü izmit doğantepe satılık arsa bir örümceğin kaç bacağı vardır