Collections 2 – List Interface
Merhabalar. Önceki yazıda Collection’a Giriş yapmıştık. Bu yazıda Collection Interface’den türetilmiş olan List interface’i inceleyeceğiz.
List interface tekrarlı veri içerebilen, sıralı olma özelliğine sahip bir collection yapısıdır. List’in tıpkı Array gibi indis yapısı vardır ve 0’dan başlar. Bu sayede List interface’i bu indis sayesinde ilgili indisdeki ve belli bir aralıktaki veriyi değiştirme imkanı sunar. List Interfaces miras aldığı Collection Interface’i metotları dışında şu işlemler için de metotlar sunar:
- İndis yapısı sayesinde Pozisyonel Ulaşım (Positional Access): Elimizdeki verileri sayısal pozisyonları (indisleri) sayesinde değiştirme (manipüle etme) imkanı sunar. Get, Set, Add, AddAll ve Remove metotları pozisyonel ulaşım ile kullanılabilen metotlara örnektir.
- Arama: Liste içindeki özel bir değeri, veriyi arar ve onun sayısal pozisyonunu döndürür. Bu işlem için indexOf metodu kullanılır. Yalnız List Interface’in tekrarlı veri tutabileceğini söylemiştik. Burada indexOf metodunu tekrarlanan bir verinin indisini bulmak için kullanırsanız değer ile ilk karşılaştığı yerdeki indis değerini size döndürür. Şöyle ki;
- Sizin listeniz içinde Akın Kaldıroğlu ismi 3. ve 6. yerlerde iki defa geçiyorsa ve siz de indexOf(“Akın Kaldıroğlu”) derseniz 3 değerini elde ederseniz. Bu durumdan dolayı bir de lastIndexOf adlı bir metot daha yazılmış. Bu da aradığınız verinin en son nerede görüldüğünü söylüyor. lastIndexOf(“Akın Kaldıroğlu”) size 6 değerini döndürür.
- İterasyon (Iteration): List düzenli (ordered) bir koleksiyon olduğu için onun üzerinde seri bir şekilde dolaşan metot yazılması amaçlanarak listIterator metodu oluşturulmuş. iterator() metodu Collection arabiriminde de vardır fakat o sadece bir sonraki elemanı verir. İndis yapısı Collection için geçerli olmadığından ileri geri durumu da söz konusu olmaz. Fakat List indisli yapıda olduğu için onun için yazılan listIterator metodu ileri geri gitme özelliğine de sahiptir.
- Belli Aralık (Range): List Interface indisli yapıda olduğu için listenin belli bir aralığı ile de işlem yapılabilir. Burada List Interface’in sublist metodu kullanılır. listeNesnesi.sublist(3,9); diyerek elimideki listenin 3. ile 9. indisleri arasındaki değerleri kullanabileceğimiz yeni bir liste oluşturduğumuzu düşünebiliriz.
Collections sınıfı içinden List Interce ve onu uygulamış nesneler için hazırlanmış olan bazı metotlar da şöyledir:
-
Sort — Merge Sort algoritması kullanarak bir listeyi sıralar. Merge Sort kullanılmasının amacı hızlı ve stabil bir sıralama elde etmektir. Şu örnek kullanımda liste içindeki değerleri String öceliklerine göre sıralanıyor:
listObject.sort(String::compareTo);
-
Shuffle — Liste içindeki verileri rastgele yer değiştirir. Şu örnek kullanımda liste içindeki veriler Random sınıfı yardımı ile ratgele yer değiştirilir. Burada shuffle metodunun sadece List ya da List’i kalıtmış objeleri kabul ettiği unutulmamalıdır.
Collections.shuffle(listObject,new Random());
-
reverse — Listedeki elementleri ters çevirir.
Collections.reverse(listObject);
-
rotate — Verilen uzaklık kadar listeyi öteleme işlemi yapar. Örneğin parametre olarak 2 verilirse listenin başındaki eleman sondan bir önceye, 2. sıradaki eleman da son sıraya gider.
Şu örnek kod 2 birim öteleme yapar:
Collections.rotate(listObject,2);
-
swap — Swap metodu verilen List içindeki verilen iki indisdeki verinin yer değiştirmesini sağlar. Şu örnek kodumuzda listObect nesnemizdeki 1. ve 3. indisler yer değiştirir.
Collections.swap(listObject,1,3);
-
replaceAll — List nesnesi içindeki tekrar eden verilerin hepsini istediğiniz başka bir değerle değiştirme imkanı sunar. Örneğin liste içinde 3 adet Günel varsa şu kod ile hepsini Öneyr yapabiliriz.
Collections.replaceAll(listObject,"Günel","Öner");
-
fill — List içindeki tüm verileri bir seferde istediğiniz bir başka bir veriye çevirme imkanı sunar. Şu örnek kodda liste içindeki tüm veriler Turgay ile değiştirilir.
Collections.fill(listObject,"Turgay");
-
copy — Bir listeyi dğer listeye kopyalama imkanı sunar. Yalnız bu yapılırken hedef listenin eski verileri koruyacağı ve kopyalananları mevcut verilerin peşine ekleyeceği anlaşılmamalıdır. Kaynak listenin indislerindeki veriler hedef listenin karşılık gelen indisindeki veri ile değiştirilir. Yani 10 tane veri tutan bir listeyi yine 10 tane veri tutan diğer listeye kopyalarsak iki liste birbirinin aynı duruma gelir. Şu örnek kodumuzda listObject hedef listeyi (verilerin aktarılacağı) nameList de kaynak listeyi (verilerin alınacağı) listeyi temsil etmektedir.
Collections.copy(listObject,nameList);
-
binarySearch — Bu metot aranmak istenen veriyi BinarySearch algoritmasını kullanarak arar.
Şu örnek kodumuzda ListObject içinde Han kelimesi aranıp indisi döndürülüyor.
Collections.binarySearch(listObject,"Han");
-
indexOfSubList — Bir listeyi diğer bir listenin içinde arayıp onun başladığı indisi döndüren metotdur. Şu örnek kodda listObject içinde nameList listesi aranıyor ve nameList’in ilk indisi ile karşılaşıldığı yer döndürülüyor. Burada nameList’in bir bütün olarak listObject içinde arandığını unutmamak gerek.
Collections.indexOfSubList(listObject,nameList)
-
lastIndexOfSubList — List nesnesi içerisinde aynı listeden iki adet barındırabilir tekrarlı veri tutma özelliğinden dolayı. Bu metot da en son karşılaşılan indisi döndürür.
Collections.lastIndexOfSubList(listObject,nameList)
Java Platformu içerisinde iki mühim List uyglaması (implementation) bulunur. Birisi ArrayList, diğeri LinkedList’tir. Biz gelecek yazıda ArrayList‘e, onu takip eden yazıda da LinkedList’e değineceğiz. Gelecek yazıda görüşene kadar sağlıcakla kalın.
https://docs.oracle.com/javase/tutorial/collections/interfaces/list.html
https://docs.oracle.com/javase/tutorial/collections/algorithms/index.html