1. Anasayfa
  2. Java

Java Collection Framework Nedir? Framework Bileşenleri – Listede Sıralama ve Arama


1

Bu makale Java Collection Framework yazı dizisinin üçüncü bölümüdür. Bu bölümde listelenmiş nesnelerin sıralanması, sıralamanın özelleştirilmesi ve listede arama işlemleri yapılacaktır.

Listede Sıralama

Önceki yazıda bir iskambil destesi yapmış ve desteyi karıştırmıştık. Card sınıfı, Suit ve Rank Enum sınıfları tanımlanmıştı. Rank enum sınıfının son halini bu yazıya bırakmıştık. Rank sınıfı istediğimiz çıktıyı vermesi için aşağıdaki gibi yeniden yazılmalıydı.


Resim-1

Bu yazıda desteyi yeniden sıralayacağız ve deste içerisinde kart arayacağız. Bunun için Card sınıfında bir takım değişiklikler yapmamız gerekecek. Öncelikle karıştırdığımız nesneyi tekrar sıralayalım. Deste içerisindeki kartları sıralayabilmek için her bir kart deste içerisindeki diğer kartlar ile karşılaştırılmalı ve renk ve değerine göre diğer uygun yere konmalı. Bu durumda iki Card nesnesi arasında büyük ya da küçük (önce ya da sonra) ilişkisini kuracak bir metoda ihtiyacımız var. Bu metodu Comparable interface’ini gerçekleyerek yazdığımızda Java Collections Framework’unun bize sağladığı sıralama algoritmalarını kullanabiliriz. Bu durumda Card sınıfına aşağıdaki kodları eklememiz gerekiyor.

İlk olarak Card sınıf tanımına implements Comparable ekledik ve bu interface’in zorunlu kıldığı compareTo metodunu gerçekledik. Bu metodun içerisinde kartları önce renklerine göre, renkleri aynı ise değerlerine göre büyükten küçüğe sıraladık. Kart renklerinin öncelik sırası Suit enum sınıfındaki sıralamasına göre belirlenmiştir. Buna göre renk sıralaması sinek, karo, kupa ve maça şeklindedir. 2 kart nesnesini karşılaştırabildiğimize göre artık desteyi sıralayabiliriz. Yapmamız gereken tek şey Collections.sort(deck); satırını koda eklemek.


Resim-2

Listede Ne Olacak?


Resim-3

Listede Özel Sıralama

Desteyi sıraladık ama bazı durumlarda sıralamanın farklı bir şekilde olmasını isteyebiliriz. Şu anda deste Sinek, Karo, Kupa ve Maça şeklinde küçükten büyüğe sıralandı. Gerçek dünyada oyun esnasında elimizdeki kartları siyah, kırmızı, siyah, kırmızı olacak şekilde gruplar halinde sıralamak isteyebiliriz. Bu tip bir sıralama yapmak istediğimizde karşılaştırma metodumuz sineklerle karoların ya da kupalarla maçaların yerini değiştirmeli. Kupalarla maçaların yerini değiştirip renklerine göre kartları sıralamış olalım. Card sınıfının compareTo metodunu değiştirirsek deste içinde ki sırlama da bundan etkilenir. Oysa biz sadece istenildiği zaman yani oyuncunun elindeki kartları sıralarken bu şekilde sıralanmasını istiyoruz.

Bu problemi gidermek için istenilen duruma özel karşılaştırma yapacak ve Comparator interfacei’ini gerçekleyecek bir PlayerComparator sınıfı yazmamız gerekiyor. Comparator interface tanımında karşılaştırma yapılacak nesnenin Card olacağı belirtiliyor ve compare metodu gerçekleniyor. Bu metod Card sınıfındaki comparteTo metoduyla tamamen aynı karşılaştırmayı yapıyor. Sadece kartların renk bilgilerini değerlendirirken kupaların değerini maçalardan fazla olacak şekilde arttırıyoruz. Böylece sıralamada maçalar daha önce gelmiş oluyor. Bu işlemi getSuitOrdinal metodunda yaptığımızı görebilirsiniz.


Resim-4

Normalde oyuncuların elindeki kartları bu şekilde sıralayacaktık ama örnek olarak elimizdeki listeyi yani desteyi siyah, kırmızı, siyah, kırmızı olacak şekilde sıralayalım. Bunun için Collections.sort metoduna PlayerComparator nesnesi vermemiz yeterli. İşte kod ve çıktısı


Resim-5

Listede Arama

Deste içerisinde bir kartın var olup olmadığını ve varsa destedeki yerini öğrenmek istediğimizde deste içinde bu kartı aramamız gerekir. Arama işlemini Collection FrameWork’ünde binarySearch metodu ile yapabiliriz. Arama işleminin en iyi performansı için listenin önceden küçükten büyüğe sıralanmış olması gerekir. Bu şekilde arama süresi O(logn) olacaktır. Örneğin destemizi sıralayıp sinek asını aramak istediğimizde kod aşağıdaki gibi olacaktır. Destenin kaçıncı indeksinde olduğunu öğrenelim.


Resim-6

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

Bu İçeriğe Tepkin Ne Oldu?
  • 0
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Lisans eğitimini Yıldız Teknik Üniversitesi Elektronik ve Haberleşme Mühendisliğinde tamamladı. İTÜ Biyomedikal Mühendisliğinden ve Bahçeşehir Üniversitesi Mühendislik Yönetiminden Yüksek Lisans derecelerini aldı. Telekominikasyon sektörünün öncü firmalarından Netaş’da yazılım mimarı olarak çalışmaktadır. Okan Üniversitesinde 2 yıl Java’ya Giriş ve Dağıtık Yazılım Uygulamaları derslerini verdi.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yorumlar (1)

    Bir yanıt yazın

    E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir