1. Ana Sayfa
  2. Java
  3. Java Collection Framework Nedir? Framework Bileşenleri – Listelerin Birleştirilmesi

Java Collection Framework Nedir? Framework Bileşenleri – Listelerin Birleştirilmesi

Bu makale Framework yazı dizisinin dördüncü bölümüdür. Bu bölümde iki liste arasında ekleme, çıkarma ve birleştirme işlemleri yapılacaktır. İlk üç bölüme aşağıdaki linklerden ulaşabilirsiniz:

  1. Java Collection Framework Nedir? Framework Bileşenleri – Ne İşe Yarar? Peki, Amacı?
  2. Java Collection Framework Nedir? Framework Bileşenleri – List ve ArrayList Anlatımı
  3. Java Collection Framework Nedir? Framework Bileşenleri – Listede Sıralama ve Arama

Giriş – Listelerin Tanımlanması

Bu yazımızın başlığı her ne kadar eş zamanlama olsa da aslında yapacağımız şey bir listenin verilerine başka bir listenin verilerini ekleyeceğiz, çıkaracağız ve birleştirme işlemi yapacağız. Daha önceki yazılarda tanımladığımız Card sınıfından iki listeyi ele alalım. Bunlardan orijinal liste diyeceğimiz bizim asıl listemiz olacak. Sunucuda tutulan asıl veriler gibi. Diğeri ise mobil cihaz gibi uzak bir ortamdan gelen benzer verileri içeren ve işlenmek üzere gönderilmiş yeni listemiz olacak.
Resim-1

İstediğimiz işlemleri yapabilmek için iki adet listeyi aşağıdaki gibi tanımlayıp ilk değerlerini verelim. Burada orijinal listeye Sinek 2’den başlayarak sırayla 6 kart ekliyoruz. Yeni listeye ise Sinek 4’den başlayarak 6 kart ekliyoruz. Bu durumda elimizde ortak elemanları ile birlikte farklı elemanları da bulunan iki liste olmuş oluyor.

public
class MergeDemo {

    private
static
final
int
MAX_COUNT = 7;

    private
static <Card> originalList;

    private
static <Card> newList;

    private
static
void initializeLists() {

        originalList = new <Card>();

        int i = 0;

        for (Rank rank : Rank.values()) {

            Card card = new Card(Suit.CLUBS, rank);

            i++;

            if (i == MAX_COUNT)

                break;

            originalList.add(card);

        }

        newList = new <Card>();

        i = 0;

        for (Rank rank : Rank.values()) {

            i++;

            if (i < 3)

                continue;

            if (i == MAX_COUNT + 2)

                break;

            Card card = new Card(Suit.CLUBS, rank);

            newList.add(card);

        }

    }

}

Liste İşlemlerde Problemin Tanımı ve Giderilmesi Bu iki listede en basit olarak yapabileceğimiz şey yeni gelen listedeki tüm verileri orijinal listeden silmektir. Bunu basitçe originalList.deleteAll(newList) metod çağırmıyla kolayca yapabiliriz. Bu işlemin sonucunda beklenen hem orijinal listede hem de yeni listede bulunan tüm elemanların orijinal listeden silinmesi olacaktır. Bu kodu çalıştırdığımızda sonuç aşağıdaki gibidir.


Resim-2

Sonuçları incelediğimizde orijinal listede hiçbir değişikliğin olmadığını görüyoruz. Bunun nedeni Card sınıfında da bir takım kodlar yazmamız gerektiğidir. Daha önceki yazılardan hatırlayacağınız gibi sıralama işlemleri için Card sınıfında karşılaştırma metodu yazmıştık. Şimdi Framework işlem yapabilmek için iki Card nesnesinin eşit olup olmadığını anlamaya çalışıyor. Bunu Object sınıfının metodunu kullanarak yaptığı için hata vermeden kod derleniyor ve çalışıyor. Fakat yanlış sonuç üretiyor. Çünkü Object sınıfının equals metodu iki Card nesnesinin aynı olup olmadığını anlamak için yeterli değil. Öyleyse Card sınıfında equals metodunu aşağıdaki gibi yeniden yazarak problemi çözmemiz gerekir.

public
class Card implements Comparable {

@Override

public
boolean equals(Object obj) {

if (obj == null) {

return
false;

}

if (getClass() != obj.getClass()) {

return
false;

}

final Card other = (Card) obj;

if (this.suit != other.suit) {

return
false;

}

if (this.rank != other.rank) {

return
false;

}

return
true;

}

}

Bu noktada bir parantez açalım. Her zaman equals metodu ile birlikte hash metodu da override edilmelidir. Hash metodunun ne işe yaradığını yazı dizisinin sonraki bölümlerinde bulacaksınız. Yeni Listedeki Verilerin Çıkartılması Şimdi artık yeni listedeki verileri orijinalinden çıkartabiliriz. Bunun için originalList.deleteAll(newList) metodunu tekrar çalıştırırsak aşağıdaki gibi bir sonuç elde ederiz.


Resim-3

Görüldüğü gibi bu sefer her iki listede ortak bulunan 4, 5, 6, 7 orijinal listeden silinmiş oldu.

Yeni Listedeki Farklı Olanları Eklemek

Yeni listede farklı olanları eklemek bu haliyle çok da zor görünmüyor. Önce yeni listeden orijinal listedekileri çıkarıp kalanları orijinal listeye eklememiz yeterli. Kod ve çıktısı aşağıdaki gibi.


Resim-4

Yeni Listede Olmayanların Silinmesi ve Yenilerin Eklenmesi

Bu ilk bakışta saçma bir işlem gibi gelebilir. Çünkü sonuçta orijinal liste yeni listenin aynısı olacak. Bu işlemin gerekliliği için şöyle bir senaryo oluşturabiliriz. Orijinal liste veri tabanında tutulan nesneleri içeriyor olsun. Bu nesnelerin eşitliği için kullandığımız değerler ile veri tabanı ID’si de farklı olsun. Bu durumda orijinal listede ID üretilmiş nesneler varken, yeni listede aynı değerlere sahip ID si olmayan nesneler ve tabi olası yeni nesneler olacaktır. Eğer birleştirme işlemi uygulamazsak ID’si üretilmiş olan nesneler silinip yerlerine yeni ID’ler üretilecek ve silinen ID’ler ile de işlem yapılmışsa ortalık tamamen karışacaktır. Böyle bir durumda asıl problem listelerin boyutları çok büyük olduğunda sistem gereksiz yere ID üretmek için çok zaman harcayacaktır. Bu bakımdan en iyi yöntem listeleri birleştirmek (merge) olacaktır. İki listenin birleştirilmesi için önce orijinal listede olup yeni listede olmayanları orijinal listeden çıkarmalıyız. Bunun için framework’un sağladığı metodunu kullanacağız. Bu metot parametre olarak verilen listedekileri tutup, geri kalanları listeden siler. İkinci adım orijinal listede olan tüm elemanları yeni listeden çıkaracağız. Bu daha önce gördüğümüz gibi deleteAll metodu ile oluyor. Son olarak da yeni listede kalan tüm elemanları orijinal listeye ekleyeceğiz. Kod ve çıktısı aşağıdaki gibidir.


Resim-5

Şimdiye kadar Java Collection Framework’ün listeler ile ilgili kullanımını gördük. Listeleri oluşturduk, karıştırdık, sıraladık, farkını aldık ve birleştirdik. Bütün bunları yapabilmek için ilgili nesnemizde equals, compareTo gibi metotlar yazmak zorunda kaldık. Böylelikle listeler ile ilgili konuları bitirmiş oluyoruz. İlgili kodları buradan indirip deneyebilirsiniz. İndirdiğiniz .zip dosyasının şifresi : mshowto.

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

www.mshowto.org

Yorum Yap

Yazar Hakkında

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.

Yorum Yap