21 Nisan 2015 Salı

Java Collections : The Set Interface

Set, aynı elemandan birden fazla barındıramayan bir Collection türüdür.
Set interface'de sadece Collection sınıfından miras aldığı metodlar vardır.
Bu metodlara aynı elemandan birden fazla bulundurmama şartını ilave etmiştir.
İki setin eşit olması için tamamen aynı aynı elemanları içermeleri gerekir.

Java platformu Set interface'inin  HashSet, TreeSet ve LinkedHashSet implementasyonlarını bulundurur.

1. HashSet

Tanımı:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable

Elemanlarını hash table'da barındırır.
En performanslı olan set implementasyonu budur.

2. TreeSet  

Tanımı:
public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, Serializable

Elemanlarını red-black tree'de barındırır.
Değerlere göre sıralama yapar. 
Performansı daha düşüktür.


3. LinkedHashSet : 
SortedSet interface'ini implement eder.
HashSet'in alt sınıfıdır.
Linked list içeren bir hash table'dan ibarettir.
elemanları eklenme sırasına göre sıralar. 
Bir setin sıralama yapmasını, fakat HashSet gibi de performanslı olmasını istediğimiz zaman kullanabiliriz.
Performansı HashSet'e göre çok az düşüktür.


Örnekler

Diyelim ki elimizde bir Collection olan "sehirler" var ve bunun içindeki kopyaları (aynı elemandan birden fazla olanları) silmek istiyoruz.


ArrayList<String> sehirler = new ArrayList<>();
sehirler.add("istanbul");
sehirler.add("ankara");
sehirler.add("izmir");
sehirler.add("istanbul");
sehirler.add("ankara");
Collection<String> tekSehirler = new HashSet<String>(sehirler);
output: [ankara, izmir, istanbul]
...
Burada tek satırda c'yi bir HashSet'e dönüştürerek conversion constructor aracılığıyla kopyalardan da kurtulmuş oluyoruz.
Sıranın değişmesini istemiyorsak HashSet yerine LinkedHashSet kullanabiliriz.

JDK 8+ için aggregate operasyonları kullanarak dönüştürebiliriz:


Set s = cities.stream().collect(Collectors.toSet());
System.out.println(s);
output: [ankara, izmir, istanbul]
...
Ya da bir TreeSet' e dönüştürebiliriz:


Set<String> set = cities.stream()
                .map(Object::toString)
                .collect(Collectors.toCollection(TreeSet::new));        
System.out.println(set);
output: [ankara, istanbul, izmir]
...


Hiç yorum yok:

Yorum Gönder