Collections 5 – Set Interface
Merhabalar. Önceki yazımızda LinkedList’i öğrenmiştik ve List Interface’i bitirmiştik. Bu yazıda Set Interface konusunu öğreneceğiz.
Set Interface tekrarlı eleman tutmayan bir koleksiyon yapısıdır. Set Interface Collection Interface’den metotları miras alır ve tekrarlı eleman tutulmasını kısıtlayan bir önlem alır. Set Interface ayrıca equals ve hashCode operasyonları üzerinde daha güçlü bir anlaşma sunar. Set instance’ları (örnekleri) implementasyonları farklı olsa bile anlamlı bir şekilde karşılaştırılabilirler. İki set instance’ı eğer aynı öğeleri barındırıyorsa onlar eşittir.
Java içerisinde Set Interface’in genel amaçlı olarak düşünebilecek 3 implementasyonu bulunur. Bunlar HashSet, TreeSet ve LinkedHashSet’tir.
-
HashSet elemanlarını bir Hash tablosu içerisinde tutar. En performanslı Set implementasyonu olmasına karşın iterasyon yaptığımızda iterasyon sırası konusunda garanti vermemektedir. Tekrarlı veri tutmayan bir Set bir implementasyonu olarak HashSet için örnek kod:
Set<Type> noDups = new HashSet<Type>(c); //Collection Framework'ün en temel interface'i Collection olduğu için Set yerine Collection da kullanılabilir. //Buradaki fark Set'in tanımından gelen tekrarlı veri tutmayışıdır. //Collection<Type> noDups = new HashSet<Type>(c);
Burada eğer elinizde bir Collection ya da ondan türetilmiş bir koleksiyon varsa ve siz tekrarsız veri içeren bir yapı istiyorsanız Java 8 ile gelen şu özelliği kullanabilirsiniz:
Collection<String> myCollection = new ArrayList<String>();
myCollection.stream().collect(Collectors.toSet());//Bunu yeni oluşturduğumuz koleksiyona atayabiliriz.
-
TreeSet elemanlarını bir red-black tree üzerinde tutar. Elemanlar değerleri temel alınarak oluşturulan bir sıra içinde tutulur. Örneğin String bir TreeSet’de elemanlar alfabetik sıraya göre sıralanır. HashSet ile kıyaslandığında oldukça yavaştır. new HashSet yerine new TreeSet dersek yeni bir TreeSet oluşturmuş oluruz. Eğer elinizde bir Collection ya da ondan türetilmiş bir koleksiyon varsa yeni bir TreeSet’i şöyle de oluşturabiliriz:
Set<String> set = myCollection.stream() .map(Person::getName) .collect(Collectors.toCollection(TreeSet::new));
-
LinkedHashSet Linked List kullanılarak ve Hash Table olarak yapılmış bir implementasyondur. Elemanların sırası eklenme sırası olarak tutulur. Ayrıca LinkedHashSet istemcilerini HashSet tarafından verilen ve maliyeti belli belirsiz daha yüksek olan belirlenmemiş ve genellikle kaotik olan sıralamadan korumaya çalışır.
Set Interface Temel İşlemler
- size() metodu Set içindeki elemanların sayısını döndürür.
- isEmpty() metodu boş olup olmadığı hakkında bilgi verir.
- add() metodu Set’e eklemek istediğimiz veriyi ekler. Yalnız eklemek için şartı eklenecek değerin Set içerisinde olmamasıdır. Eklenme sonucuna göre de bir boolean değer dönmektedir.
- remove() metodu tanımlanan değeri Set’den kaldırma işlemi yapar ve metot boolean bir sonuç döner.
- iterator() metodu Set üzerinde oluşturulmuş bir Iterator döner.
Set Interface Bulk Operations
Bulk Operation denince anlatılmak istenen birden çok veri ile bir kerede işlem yapılmasıdır. Bulk operations Set Interface için bilhassa iyi tasarlanmış operasyonlardır. Bu metotlar yazıldığında standart cebirsel işlemler yapar. Şimdi s1 ve s2’nin birer Set olduğunu düşünelim.
- s1.containsAll(s2) — Eğer s2 s1’in alt kümesi ise bu metot true değer döner. Alt küme olmasından kasıt s1’in s2’nin tüm elemanlarını barındırmasıdır.
- s1.addAll(s2) — s2’deki tüm elemanları s1’e aktarmak sureti ile s1 ve s2’nin birleşimini sağlayarak yeni s1 elde edilmesini sağlar.
- s1.retainAll(s2) — s1 Set’ini s1 ve s2 Set’lerinin kesişimine dönüştürür. s1 ve s2’deki ortak tüm elemanlar s1’e alınır ve s1 deki diğer elemanlar devre dışı bırakılır.
- s1.removeAll(s2) — hem s1 hem s2 Set’inde yer alan tüm elemanlar s1 Set’inden çıkarılır. Böylece s1’de olup s2’de olmayanların barındığı Set elde edilmiş olur.
Set interface temel olarak bu şekilde arkadaşlar. Gelecek yazıda Set Interface implementasyonu olan HashSet konusuna değineceğiz. Görüşene kadar sağlıcakla kalın.