Java ile TreeMap kullanımı

Java ile TreeMap kullanımı

Herkese merhabalar, bu yazımızda sizlere Java programlama dilinde TreeMap yapısından bahsedeceğim. TreeMap ile ilgili örnekler üzerinden konuyu anlatmaya çalışacağım.

Başlayalım

TreeMap nedir ?
Java programlama dilinde TreeMap yapısı: Map interface'i ile Navigable Map yapısının birlikte kullanılmasına olanak tanır. Burada kullanıllan Map yapısı tanımlanan key değerleri ile veya map'i oluştururken belirlenen bir sıralayıcı ile sıralanabilir. Bu işlem tanımlamada kullanılan constructor ile alakalıdır. TreeMap yapısı bu özelliği ile bizlere sıralı ve verimli bir key-value collection sınıfı sağlamaktadır.

TreeMap sınıfı 4 adet yapıcı metoda sahiptir:
  • TreeMap() : İçi boş ve normal bir sıralamaya sahip bir TreeMap nesnesi oluşturur.
  • TreeMap(Comparator<? super K> comparator) : İçi boş ve comparator ile belirtilen sıralayıcıya sahip bir TreeMap nesnesi oluşturur.
  • TreeMap(Map<? extends K,? extends V> m) : Sınıfa gönderilen bir Map yapısını kendisine kopyalayarak yeni bir TreeMap nesnesi oluşturur. Bu nesnenin sırayayıcısı kopyalanan Map nesnesi ile aynıdır.
  • TreeMap(SortedMap<K,? extends V> m) : Sınıfa gönderilen bir SortedMap yapısını kendisine kopyalayarak yeni bir TreeMap nesnesi oluşturur. Bu nesnenin sırayayıcısı kopyalanan SortedMap nesnesi ile aynıdır.

TreeMap yapısı asenkron çalışan bir yapıdır. Bu demek oluyor ki TreeMap yapısı multithread kullanımlarda, farklı threadların aynı anda erişimine izin vermektedir.

Aşağıda TreeMap yapısının hiyerarşi diagramı görülmektedir: TreeMap Class Hierachy Diagram

Aşağıda TreeMap nesnesinin oluşturulma örnekleri gösterilmiştir.


        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(1, "Burak");
        treeMap.put(2, "Hamdi");
        treeMap.put(3, "Tufan");
        
        Map<Integer,String> map = new HashMap<>();
        map.put(1, "The");
        map.put(2, "Code");
        map.put(3, "Program");
        
        TreeMap treeMap2 = new TreeMap(map);
        
        System.out.println(treeMap);
        System.out.println(treeMap2);

        System.out.println(treeMap.get(2));
        System.out.println(treeMap2.get(2));

        System.out.println(treeMap.containsKey(1));
        System.out.println(treeMap.containsValue("Hamdi"));
        System.out.println(treeMap.containsValue("harici"));
Program Çıktısı

{1=Burak, 2=Hamdi, 3=Tufan}
{1=The, 2=Code, 3=Program}
Hamdi
Code
true
true
false

TreeMap içerisine eklenen değerler, key-value çiftlerinden keylere göre sıralanır. Treemap sınıfı,i kendi içinde değere göre sıralama fonksiyonu bulunmamaktadır.

Aşağıdaki kod bloğunda ters sıralama ile eklenen değerler görülmektedir.

        TreeMap<Integer, String> treeMap3 = new TreeMap<>();
        treeMap3.put(3, "Tufan"); 
        treeMap3.put(2, "Hamdi");
        treeMap3.put(1, "Burak");
        
        System.out.println(treeMap3);
Program çıktısı aşağıdaki gibi olacaktır:

{1=Burak, 2=Hamdi, 3=Tufan}
  • TreeMap sınfı Java ile gelen Collections'a aittir.
  • TreeMap sınıfı, Map interface yapısını, implements etmektedir. Aynı zamanda NavigableMap ve SortedMap interface'lerinide implement etmektedir. Bu sayede kendi içerisinde otomatik sıralama yapmaktadır. Bu sıralama sormalde key değerlere göre yapılır ancak istersek comparator ile bizde bir sıralama belirleyebiliriz.
  • TreeMap sınıfında tanımlanan Key değerlere null değerler atanamaz. Atandığında NullPointerException alınacaktır. Fakat value alanlarına null değerler atanabilir.

Peki syncronize olmayan TreeMap yapısını synchronize olarak kullanmak istersek?

Syncronize olmayan TreeMap kullanıldığında multi-thread çalışmalarda, aynı anda yapılmaya çalışılan eleman güncelleme işlemlerinde problemler oluşabilmektedir. Bu yüzden Collections içerisinde bulunan synchronized metodlarından ilgili olan ile TreeMap yapısı başlatılmaktadır. Bu işlem direk olarak oluşturma zamanında yapılmaktadır.

Aşağıda synchronized TreeMap oluşturma yöntemleri gösterilmiştir.

NavigableMap<Integer, String> m = Collections.synchronizedNavigableMap(new TreeMap());
Map<Integer, String> smap = Collections.synchronizedMap(new TreeMap());
SortedMap<Integer, String> sm = Collections.synchronizedSortedMap(new TreeMap());

Peki TreeMap yapısının çalışma mantığı nedir
TreeMap yapısının çalışma mantığı, Red-Black tree algoritmasını kullanarak verilerin key değerleri az alınarak sıralanmasıdır. HashMap yapıları gibi elemanlar şifrelenmediği için performans olarak ciddi hız kazandırmaktadır.

Son olarak TreeMap yapısında ihtiyaç olabilecek bazı metodlara göz atalım.

        TreeMap<Integer, String> treeMap4 = new TreeMap<>();
        treeMap4.put(1, "Burak");
        treeMap4.put(2, "Hamdi");
        treeMap4.put(3, "Tufan"); 
        treeMap4.put(4, "The");
        treeMap4.put(5, "Code");
        treeMap4.put(6, "Program");
        
        System.out.println( "KeySet : " + treeMap4.keySet());
        System.out.println( "Values : " + treeMap4.values() );
        System.out.println( "EntrySet : " + treeMap4.entrySet() );
        System.out.println( "SubMap : " + treeMap4.subMap(2, 5));
        System.out.println( "firstKey : " + treeMap4.firstKey());
        System.out.println( "lastKey : " + treeMap4.lastKey());
        
        TreeMap shallowClone = (TreeMap)treeMap4.clone();
        System.out.println( "Clone : " + shallowClone);   

        shallowClone.remove(2);
        System.out.println( "remove : " + shallowClone);   

        shallowClone.clear();
        System.out.println( "clear : " + shallowClone);  
Kod bloğu çıktısı :

KeySet : [1, 2, 3, 4, 5, 6]
Values : [Burak, Hamdi, Tufan, The, Code, Program]
EntrySet : [1=Burak, 2=Hamdi, 3=Tufan, 4=The, 5=Code, 6=Program]
SubMap : {2=Hamdi, 3=Tufan, 4=The}
firstKey : 1
lastKey : 6
Clone : {1=Burak, 2=Hamdi, 3=Tufan, 4=The, 5=Code, 6=Program}
remove : {1=Burak, 3=Tufan, 4=The, 5=Code, 6=Program}
clear : {}
Bu yazıda kullanılan metodlar :
  • put : TreeMap içerisine eleman çifti ekler
  • get : TreeMap içerisinden belirtilen key aracılığıyla value alanını getirir
  • containsKey : TreeMap içerisinde belirtilen key değerini ara ve sonucu boolean olarak döndürür
  • keySet : TreeMap içerisindeki bütün key alanlarını getirir.
  • values : TreeMap içerisindeki bütün value alanlarını getirir.
  • entrySet : TreeMap içerisindeki bütün key-value çiftini tek bir yapıda getirir
  • subMap : Belirtilen iki key değeri arasındaki eleman çiftlerini getirir
  • firstKey : İlk eleman çiftini getirir
  • lastKey : Son eleman çiftini getirir
  • remove : Belirtilen key ile eleman çiftinin kaldırılmasını sağlar
  • clear : TreeMap içerisindeki bütün elemanları siler.

Bu anlatımımızda buraya kadar.

Örnek kod dosyasına Github üzerinden aşağıdaki link aracılığı ile ulaşabilirsiniz. https://github.com/thecodeprogram/TheSingleFiles/blob/master/TreeMapOrnek.java

Burak Hamdi TUFAN


Tags


Share this Post

Send with Whatsapp

Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment.

Comments

  • There is no comment. Be the owner of first comment...