y ca de m Java ile Nesne Merkezli ve Fonksiyonel Programlama w w w .s el so f t.a 8. Bölüm Torbalar (Collections) Akın Kaldıroğlu www.javaturk.org Ocak2017 ca de m y Küçük Ama Önemli Bir Konu Ø Budosyaveberaberindekitüm,dosya,kod,vb.eğitimmalzemelerinintüm w Ø w Ø w .s el so f Ø t.a Ø haklarıSelsoft Yazılım,Danışmanlık,EğitimveTic.Ltd.Şti.’ne aittir. Bueğitimmalzemelerinikişiselbilgilenmevegelişiminizamacıyla kullanabilirsinizveisteyenlerihttp://www.selsoft.academy adresine yönlendirip,bumalzemelerinengüncelhallerinialmalarınısağlayabilirsiniz. Yukarıdabahsedilenamaçdışında,bueğitimmalzemelerinin,ticari olsun/olmasınherhangibirşekilde,toplubireğitimfaaliyetindekullanılması, buamacayönelikolsun/olmasınbasılması,dağıtılması,gerçekyada sanal/Internetortamlarındayayınlanmasıyasaktır.Böylebirihtiyaçhalinde lütfenbenimle,akin.kaldiroglu@selsoft.academy adresindeniletişimegeçin. Buvebenzerieğitimmalzemelerinekatkıdabulunmakyadadüzeltmeve eleştirilerinizibanailetmekistersenizçoksevinirim. BolJava’lıgünlerdilerim. www.selsoft.academy 2 ca de m y İçerik Ø Bubölümde,torbalar(collections)elealınacaktır. w w w .s el so f t.a Ø Java’nıntorbaçatısı(collectionframework)vebuçatı altındakiarayüzler,gerçekleştirmelerivealgoritmalar incelenecektir. www.javaturk.org 3 y ca de m t.a w w w .s el so f Torbalar (Collections) www.javaturk.org 4 ca de m y TorbaNedir? w w .s el so f t.a Ø Programlamadillerindekibirdenfazladeğişkenibirarada tutanyapılaratorba(collection)denir. Ø Bazıdillerdefarklışekildeifadeedilirler,örneğinC++’da container denir. Ø Torbalar,isterilkeltiplerdenisterisekarmaşıktiplerden olsun,birdenfazladeğişkenigrupolaraktekbiryapıaltında tutarveyönetir. Ø Torbalar,dildediğerverilergibideğişkenlerleifadeedilirve metotlarageçilir,metotlardandöndürülür,vs. w Ø Programlamadillerindefarklıözelliklerlekurgulanmışve farklıamaçlarasahippekçoktorbavardır. www.javaturk.org 5 ca de m y VeriYapıları(DataStructures) t.a Ø ÜniversitelerdeVeriYapıları(DataStructures)adıyla öğretilenderslertemeldetorbalarıniçyapılarıveilgili bellek,depolamavs.gibimekanizmalaraodaklanırlar. w w w .s el so f Ø Buanlamdatorbalar,SoyutVeriYapıları’nın (Abstract Data Types)birparçasıdır. www.javaturk.org 6 y ca de m Torba Çeşitleri - I Ø Farklı amaca yönelik farklı torbalar söz konusudur. Torbaların iç yapısı farklı olsa biledışarıya açılan arayüzü,dizi (array) görünümündedir.Dolayısıyle torbadaki elemanlara dizi elemanıymış gibi yaklaşılır. so f Ø t.a Ø Torbaların şu üç tipinden bahsedilebilir: Ø Doğrusal (lineer)torbalar:Elemanlarını dizili (ordered)tutan torbalardır. el Ø İlişkilendiren (associative)torbalar:Bir girdiye karşılık bir w Ø Torba dizi olarak görünmez ve torbadaki elemanlar farklı nesnelerle ilişkilendirilerek tutulur. Butür torbalara “sözlük”(dictionary)dedenir çünkü elemanları “anahtar-değer ikilisi”(key-valuepair)yapısındadır. w Ø w .s çıktı üreten,fonksiyon gibi davranan torbalardır. www.javaturk.org 7 y ca de m Torba Çeşitleri - II Ø Graf(graph)torbalar:Bir elemanı birden fazla w w w .s el so f t.a ilişkilendiren torbalardır. elemanla www.javaturk.org 8 y ca de m Torbaların Özellikleri w w w .s el so f t.a Ø Torbalarda farklı özellikler söz konusudur: Ø Elemanları tekil olan torbalar ile aynı elemandan birden fazlaya izin veren torbalar, Ø Elemanlarını dizili (ordered)torbalar ile bir diziye sahip olmayan torbalar, Ø Elemanlarını sıralı (sorted)torbalar ile bir sıraya sahip olmayan torbalar, Ø Elemanlarına dizili bir erişim sağlayan torbalar ile sağlamayan torbalar, Ø Elemanlarına erişimi dizideki yeri ile yapan torbalar ile özel anahtar kullanan torbalar. www.javaturk.org 9 y ca de m t.a w w w .s el so f Java’da Torbalar www.javaturk.org 10 ca de m y TorbaÇatısı(CollectionFramework) Ø Java,tümdillergibi,pekçoktorbayasahiptir. w w w .s el so f t.a Ø Javailkçıkışındasahipolduğutorbayapılarını1.2 sürümündegenişletmişvebirçatıhalinegetirmiştir. Ø Torbaçatısı(collectionframework) Ø Java’nıntorbaçatısıjava.util paketialtındadırve temeldeşuyapılardanoluşmaktadır: Ø Arayüzler(interfaces) Ø Gerçekleştirmeleri(implementations) Ø Algoritmalar(algorithms)ve Ø yardımcıyapılar. www.javaturk.org 11 ca de m y EskiTorbalar İlişkilidizi(associativearray)dedenir. el Ø so f t.a Ø JavaSE’nin ilksürümünde3tanetorbavardı: Ø Dizi(array),boyutudeğişmeyenvehomojendizi, Ø java.util.Vector, dinamikveheterojendizi, Ø java.util.Hashtable, dinamikveheterojen,sözlük (dictionary)yapısı. w w w .s Ø JavaSE1.2sürümüylebirliktegelentorbaçerçevesi (collectionframework)buyapılaryerineçokdahayetkinve sistemliyeniyapılargetirdi. www.javaturk.org 12 t.a so f w w w .s el Ø Javatorbalarınıiki farklıhiyerarşiile ifadeetmek mümkündür. Ø İlkhiyerarşi doğrusal torbalarınana arayüzleri,ikinci hiyerarşiise ilişkilendiren torbalarınana arayüzleridir. ca de m y Arayüzler www.javaturk.org 13 y ca de m CollectionArayüzü - I Ø Collection arayüzü doğrusal torbaların kök arayüzüdür. w .s el so f t.a Ø Engenel torba davranışlarını bir araya getirmiştir: Ø Ekleme add()ve çıkarma remove(),boşaltma clear() Ø Bilgi almaiterator() (iterator,nesneleri tek tek geri veren yapıdır) Ø Sorgulama isEmpty(), contains(),size() Ø Dönüştürme toArray() w w Ø JavaSE1.8’detoplam 17tane metodu vardır. Ø Doğrudan bir gerçekleştirmesi yoktur. Ø Altarayüzlerinin gerçekleştirmeleri vardır. www.javaturk.org 14 add(E e) boolean addAll(Collection<? extends E> c) void clear() boolean contains(Object o) boolean containsAll(Collection<?> c) boolean isEmpty() Iterator<E> iterator() so f t.a ca de m y boolean el default Stream<E> parallelStream() boolean remove(Object o) w .s boolean w default boolean w boolean removeAll(Collection<?> c) removeIf(Predicate<? super E> filter) retainAll(Collection<?> c) www.javaturk.org 15 y ca de m int size() default Spliterator<E> spliterator() toArray(T[] a) w w w .s el <T> T[] toArray() so f Object[] stream() t.a default Stream<E> www.javaturk.org 16 y ca de m CollectionArayüzü - II so f t.a Ø Collection arayüzünün metotları daima java.lang.Object üzerinden çalışır. Ø Dolayısıyla tüm Collection nesneleri engenel tipolan Object üzerinden işlem yaparlar. w w w .s el Ø Butabi olarak çok şekilliliğin (polymorphism)bir sonucudur. Ø Budurumun negatif tarafı ise daha alttipten nesnelerin gerçek tiplerini gösterememeleridir. Ø Buyüzden bir Collection’dan alınan nesnenin gerçek tipine ulaşmak istendiğinde instanceof operatörüne ve downcaste ihtiyaç duyulur. www.javaturk.org 17 y ca de m t.a w w w .s el so f Bazı Arayüzler www.javaturk.org 18 ca de m t.a so f el w w w .s Ø Daha önce çizilen sınıf diyagramını diğer doğrusal torbalarla ilgili arayüzlerini zenginleştirebiliriz. y Tüm Arayüzler www.javaturk.org 19 y ca de m IteratorArayüzü - I so f t.a Ø Collection’un tipindeki torbalarda elemanlara ulaşmanın yöntemi java.util.Iterator arayüzüdür. Ø Iterator arayüzü Java’ya 1.2ile birlikte katılmıştır. Ø Java’da enbaştan bu yana var olan java.util.Enumeration arayüzünün yerine geçmiştir. next() w .s E hasNext() el boolean w default void forEachRemaining(Consumer<? super E> action) w default void remove() www.javaturk.org 20 y ca de m IteratorArayüzü - II w w w .s el so f t.a Ø Iterator,elemanlarını verdiği torba nesnesinden silme de yapar. Ø Buamaçla konulmuş olan remove() metodu herbir next() çağrısı için sadece bir defa çağrılmalıdır. Ø Eğer bir Collection nesnesinden Iterator nesnesini alındıktan sonra oCollection nesnesi doğrudan add() ya da remove() metodu ile değiştirilirse,ilknext() metodunda java.util.ConcurrentModificationException sıra dışı durumu oluşur. Ø Bunafail-fastdenir,yani iteratordurumu algılar algılamaz hata verir. www.javaturk.org 21 y ca de m IteratorArayüzü - III t.a Ø Buyüzden Iterator oluşturulduktan sonra Collection’dan silmeler Iterator üzerindeki remove() metodu ile yapılmalıdır. w w w .s el so f Ø Eklemeler ise Collection’dan henüz Iterator alınmadan önce tamamlanmalıdır. www.javaturk.org 22 y w w w .s el so f t.a ca de m IteratorExample.java www.javaturk.org 23 y ca de m Iterable Arayüzü - I t.a Ø java.lang.Iterable arayüzü,gerçekleştiren nesnelerin elemanlarının for-eachalınabilmesini sağlar. Ø for-eachkullanım açısından Iterator kullanımından çok daha şık ve rahattır. w .s default void el so f Ø Tüm Collection nesneleri Iterable’dırlar. Ø Ama diziler (arrays)Iterable değildirler.Neden? iterator() w Iterator<T> forEach(Consumer<? super T> action) w default Spliterator<T> spliterator() www.javaturk.org 24 y w w w .s el so f t.a ca de m IterableExample.java www.javaturk.org 25 y ca de m ComparableArayüzü Örneğin Boolean.FALSE <Boolean.TRUE el Ø so f t.a Ø java.lang.Comparable arayüzü,onu gerçekleştiren nesnelerin sıralamasında kullanılır. Ø Comparable,Java’ya 1.2ile birlikte katılmıştır. Ø JavaAPI’sindeki şu sınıflar bu arayüzü gerçekleştirirler, dolayısıyla databi sıralamaya (naturalordering)sahiptirler: Ø Tüm sarmalayan tipler (Integer,Long,Double,Boolean vs.) w .s Ø BigInteger,BigDecimal, Ø String,Date,File w w Ø Comparable arayüzünün tek bir metodu vardır. int compareTo(T o) www.javaturk.org 26 y w w w .s el so f t.a ca de m ComparableExample.java www.javaturk.org 27 y ca de m ComparatorArayüzü t.a Ø Eğer sıralanacak nesneler Comparablearayüzünü gerçekleştirmiyorlarsa neyapılabilir? Ø java.util.Comparator arayüzü,Comparablearayüzünü gerçekleştirmeyen nesnelerin sıralamasında kullanılır. w .s el so f Ø Comparatorarayüzü Java’ya 1.2ile birlikte katılmıştır. Ø JavaSE1.8’ekadar tek bir metodu vardı. Ø JavaSE1.8’depek çok default ve static metot eklenmiştir. compare(T o1, T o2) w w int www.javaturk.org 28 y w w w .s el so f t.a ca de m ComparatorExample.java www.javaturk.org 29 y ca de m Collection’un AltTipleri Ø Collection’un doğrudan bir gerçekleştirmesi yoktur. so f t.a Ø Ama iki önemli altarayüzü vardır: Ø Set Ø List w w .s el Ø Set,kümedir,tuttuğu nesneler tekil olmalıdır,aynı nesnelerden birden fazla tutmaz. Ø List ise dinamik dizidir. w Ø Buiki arayüzün gerçekleştirmeleri vardır. www.javaturk.org 30 y ca de m t.a w w w .s el so f Set ve Gerçekleştirmeleri www.javaturk.org 31 ca de m y SetArayüzü - I Ø Setarayüzü,Matematik’teki kümeyi temsil eder. so f t.a Ø Setarayüzü,Collectionarayüzünden devraldığı davranışlara bir ekleme yapmaz. Ø Sadece ekleme ile (add())ilgili bir kısıt koyar,tekil nesneler tutar. w w w .s el Ø Entemel iki özelliği: Ø Elemanları tekil olmalıdır,dolayısıyla aynı elemandan birden fazla tutmaz. Ø Dizme kavramı yoktur. Ø Dolayısıyla içindeki elemanlara ancak Iterator ile ulaşılabilir. www.javaturk.org 32 ca de m y SetArayüzü - II so f t.a Ø Torbanın içindeki elemanların daima tekil olmaları sebebiyle Setgerçekleştirmeleri daha çok Ø Bir kişinin kredi kartları,evleri,araçları ya da Ø Bir ailenin fertleri Ø gibi tekillik gerektiren durumlarda kullanılır. w w w .s el Ø Çünkü Sethereleman eklenmesinde,yani add() metodunda aynılık kontrolü yapar. www.javaturk.org 33 w w w .s el so f t.a Ø Setarayüzünün entemel iki gerçekleştirmesi vardır: Ø HashSet,Set’i doğrudan gerçekleştirir ve ensık kullanılandır. Ø TreeSet ise Set’in alt arayüzleri olan SortedSet ve NavigableSet arayüzlerini de gerçekleştirir ve genelde sadece sıralama gerektiğinde kullanılır. ca de m y SetArayüzü - III www.javaturk.org 34 y ca de m t.a w w w .s el so f HashSet www.javaturk.org 35 ca de m y SetGerçekleştirmesi:HashSet - I t.a Ø HashSet,arka tarafta bir HashMap tarafından desteklenen bir Set gerçekleştirmesidir. Ø HashSet,herhangi bir dizilim sözü vermez,var olan dizilim zamaniçinde değişebilir. el so f Ø HashSet,null referanslara izin verir. Ø HashSet,temel fonksiyonlarda (add(),remove(),contains(), ve size())sabite yakın,O(1),bir performans sağlar. w w w .s Ø HashSet,bir Set,olduğundan elemanlarına ancak Iterator ile erişilebilir. Ø Budaeleman sayısıyla orantılı,lineer bir performans sağlar. www.javaturk.org 36 ca de m y SetGerçekleştirmesi:HashSet - II el HashSet() so f t.a Ø HashSet,4tane kurucu metoda sahiptir. Ø Varsayılan kurucu başlangıç kapasitesi 16ve doluluk oranı 0,75olan boş bir HashSet oluşturur. Ø Arzu edilirse HashSet oluşturulurken başlangıç kapasitesi ve doluluk oranı verilebilir. w .s HashSet(Collection<? extends E> c) HashSet(int initialCapacity) w w HashSet(int initialCapacity, float loadFactor) www.javaturk.org 37 y ca de m FindDuplicates.java Ø HashSet’ten içindeki elemanları iteratoryoluyla alınmasına dikkat edin. so f t.a Ø Elemanlar hangi sırayla geliyorlar? w w w .s el Ø Eleman eklenirken dizilim değişiyor mu? www.javaturk.org 38 ca de m y SetGerçekleştirmesi:HashSet - III Ø Set arayüzü için “elemanları tekil olmalıdır,dolayısıyla aynı elemandan birden fazla tutmaz.”dendi. w w w .s el so f t.a Ø HashSet,iki elemanın aynı olup olmadığını nasıl anlar? www.javaturk.org 39 ca de m y SetWithDuplicatedObjects.java el so f t.a Ø Örneği Employeesınıfının aşağıda belirtilen farklı şekilleriyle çalıştırın: Ø equals()ve hashCode() overrideedilmemiş, Ø Sadece equals() overrideedilmiş, Ø Sadece hashCode() overrideedilmiş, Ø Hemequals()ve hashCode() overrideedilmiş. w w w .s Ø Hangi durumda HashSet’in birbirinin aynı olan nesnelerden sadece bir tane tuttuğunu gözlemlediniz? www.javaturk.org 40 ca de m y SetGerçekleştirmesi:HashSet - IV w w w .s el so f t.a Ø HashSet,iki elemanın aynı olup olmadığını şöyle belirlemek için eklenen nesnelerin equals() ve hashCode() metotlarını çağırır ve ilkinden true ikincisinden aynı int değer dönerse, bu iki nesnenin aynı olduğuna karar verir. Ø Çağrı sırası ise şöyledir: Ø Önce hashCode() metodu çağrılır, Ø Dönen sonuçlar aynı ise equals()metodu çağrılır, Ø Buçağrı datrue döndürürse nesnenin aynısının zaten torbada olduğuna karar verilir, Ø Ve add() metodu ekleme yapmadan false döndürür. Ø Buiki çağrıdan birisi için aksi durumolursa eleman eklenir ve add() metodu true döndürür. www.javaturk.org 41 ca de m y SetGerçekleştirmesi:HashSet - V Ø Tüm sarmalayan tipler (Integer,Long,Double,Boolean vs.) Örneğin Boolean.FALSE <Boolean.TRUE el Ø so f t.a Ø JavaAPI’sindeki aşağıdaki tiplerin equals() ve hashCode() metotları olması gerektiği gibi overrideedildiğinden bu tiplerin nesneleri tabi olarak aynılık-farklılık kontrolünden geçerler: w .s Ø BigInteger,BigDecimal, w w Ø String,Date,File www.javaturk.org 42 ca de m y Hashingve HashFonksiyonları Ø HashSet arka planda bir HashMap tarafından desteklenir. t.a Ø Buyapılarda adı geçen “hash”nedir? Ø Hash,girdilerine karşılık bir tamsayı değer üreten fonksiyonlara verilen genel bir isimdir. w w w .s el so f Ø Hashfonksiyonlarının herbir farklı girdi için farklı değer üretmesi beklenir. Ø Böyle hashfonksiyonlarına evrensel hashfonksiyonları (universalhashfunctions)denir. Ø Hashfonksiyonları tipik olarak,HashSet gibi,elemanlarının düzenlemesi ön taraftan gelişi güzel görünen yapıların gerçekte onları yapısal olarak düzenlenmesinde kullanılır. www.javaturk.org 43 y ca de m Hashingve HashCode- I w w w .s el so f t.a Ø java.lang.Object üzerindeki hashCode() metodu native olarak gerçekleştiren ve nesnenin bellekteki adresini kullanarak int bir değer üreten bir hashfonksiyonu kullanır. Ø hashCode() metodunun özelliği,tutarlılık açısından equals() metodunun true döndürdüğü nesneler için aynı int değeri hasholarak döndürmesidir. Ø Yani durumu aynı olan aynı tipten nesneler için aynı hash codesöz konusudur. Ø Yani durumu aynı olmayan aynı tipten nesneler için farklı hash codesöz konusudur. Ø Aynı tipten olmayan nesneler için tabii olarak farklı hashcode söz konusudur. www.javaturk.org 44 y ca de m Hashingve HashCode- II w w w .s el so f t.a Ø Java’nın bazı sınıflarında hashcodeşöyle hesaplanır: Ø Integersınıfı int değerini hashcodeolarak çevirir, Ø Longsınıfı (int)(value^(value>>>32))değerini, Ø Doublesınıfı (int)(bits^(bits>>>32))değerini, Ø Charactersınıfı(int)valuedeğerini, Ø Booleansınıfı,true vefalse için1231ve1237değerlerini, Ø Stringsınıfıs[0]*31^(n-1) +s[1]*31^(n-2) +...+s[n-1] değerini döndürür. www.javaturk.org 45 y w w w .s el so f t.a ca de m HashCodeExample.java www.javaturk.org 46 y ca de m t.a w w w .s el so f TreeSet www.javaturk.org 47 ca de m y SetGerçekleştirmesi:TreeSet-I w .s el so f t.a Ø TreeSet,elemanlarını sıralı (sorted)tutan bir başka Set gerçekleştirmesidir. Ø TreeSet,hemNavigableSet hemdeSortedSet’tir. Ø TreeSet,bir Red-Blacktreegerçekleştirmesi olan TreeMap tarafından desteklenir. Ø Dolayısıyla HashSet herhangi bir dizilim sözü vermezken, TreeSet dedizilim sıralamadır ve var olan dizilim zaman içinde değişebilir. w w Ø TreeSet,null referanslara izin verir. Ø TreeSet,temel fonksiyonlarda (add(),remove(), contains()) O(lgn) bir performans sağlar. www.javaturk.org 48 y ca de m FindDuplicates.java Ø Aynı örneği bu sefer deTreeSet ile çalıştırın. t.a Ø TreeSet’ten içindeki elemanları iteratoryoluyla alınmasına dikkat edin. so f Ø Elemanlar hangi sırayla geliyorlar? w w w .s el Ø Eleman eklenirken dizilim değişiyor mu? www.javaturk.org 49 ca de m y SetGerçekleştirmesi:TreeSet-II w w w .s el so f t.a Ø TreeSet,hemNavigableSet hemdeSortedSet’tir. www.javaturk.org 50 y ca de m SortedSet Arayüzü so f t.a Ø java.util.SortedSet,elemanları üzerinde sıralama yapan Set‘tir. Ø SortedSet’in elemanları Comparable arayüzünü gerçekleştirmelidir. Ø Ya daSortedSet gerçekleştirmesine Comparator geçilmelidir. comparator() E first() E w .s SortedSet<E> el Comparator<? super E> headSet(E toElement) last() spliterator() SortedSet<E> subSet(E fromElement, E toElement) SortedSet<E> tailSet(E fromElement) w w default Spliterator<E> www.javaturk.org 51 y ca de m NavigableSet Arayüzü Ø java.util.NavigableSet,SortedSet’in yapı içinde arama amacıyla gezmeye ve aranana enyakın elemanı bulmaya izin veren arayüzdür. el so f t.a ceiling(E e) descendingIterator() descendingSet() floor(E e) headSet(E toElement) headSet(E toElement, boolean inclusive) higher(E e) iterator() lower(E e) pollFirst() pollLast() subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) SortedSet<E> subSet(E fromElement, E toElement) SortedSet<E> tailSet(E fromElement) NavigableSet<E> tailSet(E fromElement, boolean inclusive) w w w .s E Iterator<E> NavigableSet<E> E SortedSet<E> NavigableSet<E> E Iterator<E> E E E NavigableSet<E> www.javaturk.org 52 w w w .s el so f t.a ca de m y NavigableAndSortedSetExample.java www.javaturk.org 53 ca de m y SetGerçekleştirmesi:TreeSet-II w .s el so f t.a Ø TreeSet,eklenen elemanları sıralamak için şu iki yöntemi kullanır: Ø Eğer elemanlar gerçekleştiriyorlarsa,Comparable arayüzünü Ø Elemanların Comparable arayüzünün gerçekleştirmediği durumlarda kendisine geçilen Comparatorarayüzünü Ø Eğer elemanlar tabi sıralamaya (naturalordering)sahiplerse buna gerek yoktur. Ø Buyüzden TreeSet,aşağıdaki kuruculara sahiptir. TreeSet() w TreeSet(Collection<? extends E> c) w TreeSet(Comparator<? super E> comparator) TreeSet(SortedSet<E> s) www.javaturk.org 54 ca de m y SetGerçekleştirmesi:TreeSet-III w w w .s el so f t.a Ø TreeSet’e eklenecek elemanların sınıflarında equals(), hashCode() ve Comparable arayüzünden gelen compareTo() (ya daComparator arayüzündeki compare())metotlarının tutarlı bir şekilde sıralamayı gerçekleştirilmeleri gereklidir. Ø equals(),metodunun truedöndürdüğü nesnelerin hashCode() metotları daaynı int değeri döndürmeli, Ø equals(),metodunun true döndürdüğü nesnelerin gerçekleştirdiği Comparable arayüzün compareTo() (ya da Comparator arayüzündeki compare())metotları da0 döndürmelidir. www.javaturk.org 55 y w w w .s el so f t.a SetWithDuplicatedObjects ca de m TreeSetExample.java www.javaturk.org 56 y ca de m HashSet miTreeSet mi?- I t.a Ø HashSet ile TreeSet arasındaki temel fark,TreeSet’in elemanlarını sıralıyor olmasıdır. Ø Dolayısıyla sıralama isteniyorsa TreeSet kullanılmalıdır. so f Ø Aksi taktirde HashSet kullanılmalıdır, w w w .s el Ø Çünkü HashSet,temel fonksiyonlarda (add(),remove() ve contains())sabite yakın,O(1), bir performans sağlarken TreeSet O(lgn) bir performans sağlar. www.javaturk.org 57 y ca de m t.a w w w .s el so f List ve Gerçekleştirmeleri www.javaturk.org 58 ca de m y ListArayüzü - I w w w .s el so f t.a Ø Listarayüzü,dinamik diziyi (array)temsil eder. Ø Dolayısıyla Listarayüzü,elemanları için ardışıl (sequential)bir dizilim sağlar. Ø List,bu amaçla,eleman için “yer”(“position)kavramına sahiptir. Ø Yer kavramı sıklıkla “indis”(“index”)ile deifade edilir. Ø List,tekillikle ilgilenmez,bu yüzden aynı elemandan birden fazla tutabilir. Ø Listarayüzü,Collectionarayüzünden devraldığı davranışlara ardışıllık ile ilgili eklemeler yapar. www.javaturk.org 59 ca de m y ListArayüzü - II Ø Listarayüzü,Collectionarayüzünden devraldığı davranışlara ardışıllığın getirdiği eklemeler yapar. Ø Buek metotlarda hep “index”bilgisi mevcuttur. add(int index, E element) boolean addAll(int index, Collection<? extends E> c) E get(int index) int indexOf(Object o) so f el w .s int lastIndexOf(Object o) remove(int index) w w E E t.a void List<E> set(int index, E element) subList(int fromIndex, int toIndex) www.javaturk.org 60 ca de m y ListArayüzü - III el so f t.a Ø Listarayüzü,Iterable’dır,Collectionarayüzünden devraldığı iterator() metoduna ListIterator döndüren iki yeni metot ekler. Ø Listarayüzünde ayrıca elemanları sıralamaya yarayan defaultsort()metodu davardır. Ø Bumetot için elemanlar için bir Comparator gerçekleştirmesi sağlanmalıdır. listIterator() ListIterator<E> listIterator(int index) w .s ListIterator<E> w w default void default void sort(Comparator<? super E> c) replaceAll(UnaryOperator<E> operator) www.javaturk.org 61 y ca de m ListGerçekleştirmeleri Ø w .s el so f t.a Ø Listarayüzünün temelde iki gerçekleştirmesi vardır: Ø ArrayList: Standart ve ençok kullanılan dinamik dizi gerçekleştirmesidir. Ø LinkedList:Bağlı liste (linkedlist)gerçekleştirmesidir. Ø Bunlar dışında,enbaştan bu yana Java’da olan Vector ve onun daalttipiStack gerçekleştirmeleri vardır. Ø JavaSE1.2sürümüyle,APIsi List’e uygun halegetirildi. Ø Vector:Dinamik dizi gerçekleştirmesidir. synchronized olduğu için pek sık kullanılmaz ArrayList ya da w LinkedList tercih edilir. w Ø Stack:Yığın gerçekleştirmesidir.Çoğunlukla sadece APIsi kullanılır. www.javaturk.org yığın 62 y w w w .s el so f t.a ca de m ListGerçekleştirmeleri - I www.javaturk.org 63 y ca de m t.a w w w .s el so f ArrayList ve LinkedList www.javaturk.org 64 ca de m y ListGerçekleştirmesi:ArrayList t.a Ø ArrayList: Enstandart dinamik dizi gerçekleştirmesidir. Ø Ençok kullanılan List’tir. Ø ArrayList ihtiyaca göre büyüyebilir ve küçülebilir. so f Ø ArrayList’in üç tane kurucusu vardır. Ø ArrayList’in varsayılan kurucusu boş bir listoluşturur. w .s el Ø ArrayList’in girilen değer kadar odaya sahip olan bir nesne oluşturan kurucusu davardır. ArrayList() w ArrayList(Collection<? extends E> c) w ArrayList(int initialCapacity) www.javaturk.org 65 ca de m y ListGerçekleştirmesi:LinkedList Ø LinkedList,bağlı listedir. so f t.a Ø LinkedList’in elemanları,sağ ve soltaraftaki komşularını bilir. Ø Yani LinkedList’in iki taraflı bağlı listedir (doublelinkedlist). el Ø LinkedList’in iki tane kurucusu vardır. w .s Ø LinkedList’in varsayılan kurucusu boş bir listoluşturur. w LinkedList() w LinkedList(Collection<? extends E> c) www.javaturk.org 66 w w w .s el so f t.a ca de m y ListExample.java www.javaturk.org 67 ca de m y ArrayList miLinkedList mi?- I w w w .s el so f t.a Ø ArrayList ile LinkedList arasındaki temel fark,LinkedList’in elemanlarının heriki tarafındaki elemanı biliyor olmasıdır. Ø Buyüzden Java’daki LinkedList çift taraflı listtir. Ø Buise LinkedList ve ArrayList arasında farklı davranışlar için farklı performanslara sebep olur. Ø Erişimde ArrayList sabit,O(1) performansa sahipken LinkedList elemanı linkler üzerinden giderek bulduğu için doğrusal (lineer)bir performansa O(n)sahiptir. Ø Ekleme ve çıkarmada (add() &remove())ArrayList O(n), LinkedList ise O(1) performansa sahiptir. Ø Arama heriki yapı için deO(n)’dır. www.javaturk.org 68 ca de m y ArrayList miLinkedList mi?- II so f t.a Ø Dolayısıyla,başa ya daaraya ekleme-çıkarma yapılmadığında ArrayList tercih edilmelidir. Ø Çünkü LinkedList’te eleman erişimi,linkler üzerinden gidilerek yapıldığından,lineerdir,pahalıdır. w w w .s el Ø Ama başa ya daaraya ekleme-çıkarma yapılacaksa LinkedList tercih edilmelidir. Ø Çünkü ArrayList’te sona yapılanlar dışındaki ekleme-çıkarma işlemleri,lineerdir,pahalıdır. www.javaturk.org 69 y w w w .s el so f t.a ca de m ListPerformance.java www.javaturk.org 70 y ca de m t.a w w w .s el so f Stack www.javaturk.org 71 ca de m y ListGerçekleştirmesi:Stack t.a Ø Stack elemanları üst üste konulan bir yığındır ve “songiren ilkçıkar”(last-in-first-out,LIFO)ilkesiyle çalışır. Ø Stack’in boş bir yığın oluşturan bir tane kurucusu vardır: so f Stack() el Ø Stack bir List’tir ama onu “yığın”yapan farklı metotları da vardır: peek() E pop() E push(E item) int search(Object o) w w w .s E www.javaturk.org 72 y ca de m w w w .s el so f t.a StackExample.java www.javaturk.org 73 y ca de m t.a w w w .s el so f Map ve Gerçekleştirmeleri www.javaturk.org 74 ca de m y MapArayüzü - I Ø Maparayüzü,elemanlarını bellianahtar nesnelerle eşleştirerek tutan torbaların ana arayüzüdür. el so f t.a Ø Dolayısıyla bir Map,anahtar – değer ikilisi tutar. Ø Buradaki eleman değerdir ve bir anahtar ile eşleştirilerek torbada tutulur. Ø Bundan dolayı dagenelde elemanlara anahtarlarıyla ulaşılır. w w w .s Ø Map’de iki Collection nesnesi vardır: Ø Anahtarları tutan Set’tir,dolayısıyla anahtarlar tekildir. Ø Değerleri tutan ise Collection’dır,dolayısıyla farklı anahtarlarla eşleştirilmiş aynı nesneler tutulabilir. www.javaturk.org 75 void clear() compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) computeIfAbsent(K key, Function<? super K,? extends V> ca de m y default V default V mappingFunction) computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) t.a efault V containsKey(Object key) boolean containsValue(Object value) so f boolean Set<Map.Entry<K,V>> entrySet() forEach(BiConsumer<? super K,? super V> action) V get(Object key) Set<K> w .s w boolean getOrDefault(Object key, V defaultValue) isEmpty() w default V el default void keySet() default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> www.javaturk.org remappingFunction) 76 y put(K key, V value) void putAll(Map<? extends K,? extends V> m) default V putIfAbsent(K key, V value) V remove(Object key) t.a ca de m V so f default boolean remove(Object key, Object value) default V replace(K key, V value) el default boolean replace(K key, V oldValue, V newValue) replaceAll(BiFunction<? super K,? super V,? extends V> function) int size() w w .s default void values() w Collection<V> www.javaturk.org 77 ca de m y MapArayüzü - I w Ø JavaSE1.2sürümüyle,APIsi Map’e uygun halegetirildi. synchronized olduğu için pek sık kullanılmaz,HashMap ya daTreeMap tercih edilir. w Ø w .s el so f t.a Ø Map arayüzünün entemel iki gerçekleştirmesi vardır: Ø HashMap,Map’i doğrudan gerçekleştirir ve ensık kullanılandır. Ø TreeMap ise Map’in altarayüzleri olan SortedMap ve NavigableMap arayüzlerini degerçekleştirir ve sıralama (sort) gerektiğinde kullanılır,ve sıralama anahtarlar üzerinden yapılır. Ø Ayrıca Map’in Hashtable isimli bir başka gerçekleştirmesi de mevcuttur. Ø Hashtable,Java’nın enbaşından bu yana olan ilişkilendiren (associative)torbasıdır. www.javaturk.org 78 w w w .s el so f t.a ca de m y MapArayüzü - II www.javaturk.org 79 y ca de m t.a w w w .s el so f HashMap www.javaturk.org 80 ca de m y MapGerçekleştirmesi:HashMap - I Ø HashMap,enstandart ve ensık kullanılan bir Map gerçekleştirmesidir. so f t.a Ø HashMap,tamamen Map APIsine sahiptir. w .s el Ø HashMap,anahtarlar ya dadeğerler için herhangi bir dizilim sözü vermez,var olan dizilim zamaniçinde değişebilir. w w Ø HashMap,anahtar olarak dadeğer olarak danull referanslara izin verir. www.javaturk.org 81 ca de m y MapGerçekleştirmesi:HashMap - II w .s el so f t.a Ø HashMap,temel fonksiyonlarda (put(),remove(), contains(),ve get())sabite yakın,O(1),bir performans sağlar. Ø HashMap,4tane kurucu metoda sahiptir. Ø Varsayılan kurucu başlangıç kapasitesi 16ve doluluk oranı 0,75olan boş bir HashMap oluşturur. Ø Arzu edilirse HashMap oluşturulurken başlangıç kapasitesi ve doluluk oranı verilebilir. HashMap() w HashMap(int initialCapacity) w HashMap(int initialCapacity, float loadFactor) HashMap(Map<? extends K,? extends V> m www.javaturk.org 82 y w w w .s el so f t.a ca de m HashMapExample.java www.javaturk.org 83 y ca de m HashMap ve HashCode w w w .s el so f t.a Ø HashMap gibipek çok nesne,hash kodları,nesneleri takip etmek ve hızlıca ulaşmak için kullanır. Ø Örneğin HashMap sınıfının put() metodunda geçilen anahtarın (key)hash değerini tutar. Ø Anahtarlar tekildir,aynı anahtardan sadece ve sadece bir tane vardır. Ø Dolayısıyla get()metoduna bir anahtar geçildiğinde,önce hash kodunu bulur,sonra değere ulaşır ve O(1) hızında değeri gerigetirir. Ø Eğer HashMap’de,put() metoduna geçilen anahtardan zaten mevcutsa (bu dazaten anahtarın hash kodu ile anlaşılır),bu durumda eski değer geridöndürülüp yerine yeni değer konur. www.javaturk.org 84 ca de m y HashMap’ten Nesne Alma- I w .s el so f t.a Ø Map’de iki Collection nesnesi vardır,anahtarlar için keyset Set,değerleri için ise Collection’dır. Ø Dolayısıyla var olan bir anahtara karşılık gelen nesnenin bulunması ancak şu şekilde olabilir: Ø Önce keySet()metodu ile keysetalınır, Ø Sonra keysetteki anahtarlar üzerinden iteratorile geçilir, Ø Map’den get()metoduna keygeçilerek ile valuealınır. w w Set keys = map.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { Key key = (Key) iterator.next(); Value value = (Value) map.get(key); } www.javaturk.org 85 ca de m y HashMap’ten Nesne Alma- II Ø Arzu edilirse doğrudan değer torbası da values()metodu ile alınabilir. so f t.a Collection values = map.values(); Iterator iterator = values.iterator(); while (iterator.hasNext()) { Value value = (Value) iterator.next(); } w .s el Ø Ya daMap’ten entrySet() metoduyla Map.Entry nesnelerinden oluşan Set alınabilir. w w Set entrySet = map.entrySet(); Iterator iterator = entrySet.iterator(); while (iterator.hasNext()) { Map.Entry mapEntry = (Entry) iterator.next(); Object key = mapEntry.getKey(); String value = mapEntry.getValue(); } www.javaturk.org 86 ca de m y MapEntry Ø Map.Entry,Map’teki anahtar-değer çiftini (key-valuepair) ifade eden bir arayüzdür. t.a static <K extends Comparable<? super K>,V> Comparator<Map.Entry<K,V>> comparingByKey() so f static <K,V> Comparator<Map.Entry<K,V>> comparingByKey(Comparator<? super K> cmp) el static <K,V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() V w V getKey() w K w .s static <K,V> Comparator<Map.Entry<K,V>> comparingByValue(Comparator<? super V> cmp) boolean equals(Object o) getValue() setValue(V value) www.javaturk.org 87 ca de m y MapGerçekleştirmesi:TreeMap - I Ø TreeMap,anahtarları sıralayan bir Map gerçekleştirmesidir. t.a Ø TreeMap,hemSortedMap hemdeNavigableMap’tir. el so f Ø TreeMap,bir Red-Blacktreeolarak gerçekleştirilir. w w w .s Ø TreeMap,anahtar olarak null referansa izin vermez ama değer olarak null referansa izin verir. www.javaturk.org 88 entrySet() K firstKey() t.a Set<Map.Entry<K,V>> SortedMap<K,V> headMap(K toKey) Set<K> keySet() K lastKey() el subMap(K fromKey, K SortedMap<K,V> tailMap(K fromKey) Collection<V> values() w .s SortedMap<K,V> toKey) w w y Comparator<? super K> comparator() so f Ø java.util.SortedMap ,anahtarları sıralayan Map‘tir. Ø Anahtarlar Comparable arayüzünü gerçekleştirmelidir. Ø Ya daSortedMap gerçekleştirmesin e Comparator geçilmelidir. ca de m SortedMap Arayüzü www.javaturk.org 89 y ca de m NavigableMap Arayüzü w w w .s el so f t.a Ø java.util.NavigableMap,SortedMap’in inyapı içinde aramaya yapmaya ve aranana enyakın elemanları bulmayı sağlayan arayüzdür. www.javaturk.org 90 el so f t.a ca de m y ceilingEntry(K key) ceilingKey(K key) descendingKeySet() descendingMap() firstEntry() floorEntry(K key) floorKey(K key) headMap(K toKey) headMap(K toKey, boolean inclusive) higherEntry(K key) higherKey(K key) lastEntry() lowerEntry(K key) lowerKey(K key) navigableKeySet() pollFirstEntry() pollLastEntry() subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) subMap(K fromKey, K toKey) tailMap(K fromKey) tailMap(K fromKey, boolean inclusive) w .s Map.Entry<K,V> K NavigableSet<K> NavigableMap<K,V> Map.Entry<K,V> Map.Entry<K,V> K SortedMap<K,V> NavigableMap<K,V> Map.Entry<K,V> K Map.Entry<K,V> Map.Entry<K,V> K NavigableSet<K> Map.Entry<K,V> Map.Entry<K,V> NavigableMap<K,V> w w SortedMap<K,V> SortedMap<K,V> NavigableMap<K,V> www.javaturk.org 91 w w w .s el so f t.a ca de m y NavigableAndSortedMapExample.java www.javaturk.org 92 ca de m y MapGerçekleştirmesi:TreeMap - II el so f t.a Ø TreeMap,temel fonksiyonlarda (put(),remove(),contains(), ve get()),O(lgn),bir performans sağlar. Ø HashMap,4tane kurucu metoda sahiptir. Ø Varsayılan kurucu başlangıç kapasitesi 16ve doluluk oranı 0,75olan boş bir HashMap oluşturur. Ø Arzu edilirse HashMap oluşturulurken başlangıç kapasitesi ve doluluk oranı verilebilir. w .s HashMap() w HashMap(int initialCapacity) w HashMap(int initialCapacity, float loadFactor) HashMap(Map<? extends K,? extends V> m www.javaturk.org 93 y w w w .s el so f t.a ca de m TreeMapExample.java www.javaturk.org 94 ca de m y HashMap mimiTreeMap mi?- I w w w .s el so f t.a Ø ArrayList ile LinkedList arasındaki temel fark,LinkedList’in elemanlarının heriki tarafındaki elemanı biliyor olmasıdır. Ø Buyüzden Java’daki LinkedList çift taraflı listtir. Ø Buise LinkedList ve ArrayList arasında farklı davranışlar için farklı performanslara sebep olur. Ø Erişimde ArrayList sabit,O(1) performansa sahipken LinkedList elemanı linkler üzerinden giderek bulduğu için doğrusal (lineer)bir performansa O(n)sahiptir. Ø Ekleme ve çıkarmada (add() &remove())ArrayList O(n), LinkedList ise O(1) performansa sahiptir. Ø Arama heriki yapı için deO(n)’dır. www.javaturk.org 95 y ca de m t.a w w w .s el so f Dönüşümler www.javaturk.org 96 ca de m y Torbalar Arası Dönüşümler - I t.a Ø Torbalar arasında dönüşümler yapmayı sağlayan metotlar, torbaların APIlerinde mevcuttur. Ø Bunların bazıları kurucu metotlardır: so f ArrayList(Collection<? extends E> c) LinkedList(Collection<? extends E> c) el HashSet(Collection<? extends E> c) w .s TreeSet(Collection<? extends E> c) HashMap(Map<? extends K,? extends V> m) w TreeMap(Map<? extends K,? extends V> m) w TreeMap(SortedMap<K,? extends V> m) www.javaturk.org 97 ca de m y Torbalar Arası Dönüşümler - II Ø Bütün Collection nesneleri diziye dönüştürülebilir: toArray() t.a Object[] asList(T... a)) el List<T> so f Ø Arrays’in aşağıdaki metodu ile bir diziden sabit uzunlukta bir List elde edilebilir: w .s Ø Map’ten üç tane farklı Collection nesnesi alınabilir: w Set<K> keySet() w Collection<V> values() Set<Map.Entry<K,V>> entrySet() www.javaturk.org 98 y ca de m t.a w w w .s el so f Algoritmalar www.javaturk.org 99 ca de m y Algoritmalar w w w .s el so f t.a Ø Java’da dizilerle (array)ilgili algoritmalar genel olarak java.util.Arrays isimli araç (utility)sınıfında ve statik metotlar olarak bulunur. Ø Java’da torbalarla ilgili algoritmalar ise genel olarak java.util.Collections isimli araç (utility)sınıfında ve statik metotlar olarak bulunur. Ø Collections sınıfındaki algortimalar çok şekillidir (polymorphic), Ø Metotlar algoritmanın tabiatına göre parametre olarak bazen Collection bazen ise List alır. Ø Metotlar,geçilen Collections nesnesi null olduğunda NullPointerException fırlatır. www.javaturk.org 100 ca de m y CollectionsSınıfı w w w .s el so f t.a Ø Collections sınıfındaki algortimalar çok şekillidir (polymorphic). Ø Metotlar algoritmanın tabiatına göre parametre olarak bazen Collection bazen deList alır. Ø Metotlar,geçilen Collections nesnesi null olduğunda NullPointerException fırlatır. Ø Algoritmalar arasında,unmodifiedSet(),unmodifiedList() gibi var olan torbanın değiştilemeyen (unmodifiable)şeklini üreten toplam 8metot vardır. Ø Algoritmalar arasında,synchronizedSet(),synchronizedList(), vs.gibi var olan torbanın synchronized yani thread-safe şeklini üretenler vardır. www.javaturk.org 101 y ca de m Algoritma Örnekleri w w w .s el so f t.a Ø algorithmspaketi. www.javaturk.org 102 ca de m y Özet Ø Bubölümdetorbalarelealındı. so f t.a Ø Javacollection frameworkündeki farklıamaçlara yönelik farklıtorbayapılarıincelendi. w w w .s el Ø TorbalarüzerindeçalışanalgoritmalarıiçerenCollections sınıfıelealındı. www.selsoft.academy 103 y ca de m t.a w w w .s el so f Ödevler www.selsoft.academy 104 ca de m y Ödevler I t.a Ø DahaönceoluşturduğunuzüniversiteörneğindekiStudent hiyerarşisinielealınveöğrencileriönceComparable sonrada Comparator arayüzü ilesıralanabiliryapın. w w w .s el so f Ø Dahaönceoluşturduğunuzkarmaşıksayılarsınıfınınnesnelerini önceComparable sonradaComparator arayüzü ilesıralanabilir yapın. www.javaturk.org 105 ca de m y Ödevler II w w w .s el so f t.a Ø İsim,soyisimilebirdenfazlaadresvetelefonasahipolankişileri düşünün.Bukişilerisoyisimlerininbaşharflerinegöre sınıflandırılmışşekildetutacakbiryapıkurgulayınöyleki Ø Kişilertekildir, Ø İsim,soyisim,adresvetelefonüzerindenetkinaramaişlemleri yapılabilmelidir, Ø Listelemevesıralamayetkinlikleriolmalıdır. www.javaturk.org 106