## Set interface (Arayüzü)
Collection interfaceâden kalıtım almıÅtır. Aynı elemanların veri kümesi içinde tekrar bulunmasına izin vermez. HashSet sınıfı en yaygın olan alt sınıfıdır. Eleman tekrarının olmamasını saÄlayabilmek için veri kümesi içindeki nesnelerin "equals" ve "hashCode" fonksiyonlarının tanımlı olması gerekir.
Set interfaceâin alt sınıfları:
\- EnumSet
\- HashSet
\- LinkedHashSet
\- TreeSet
### HashSet Sınıfı
Liste tipinde veri tutmayı saÄlar. Veri kümesindeki elemanlara ekleme, silme ve eriÅim imkanı tanır. Veri kümesinde mükerrer deÄer tutmaz. Mükerrer deÄer tutmamayı nesnelerdeki hashCode fonksiyonunu kullanarak saÄlar. ânullâ deÄer eklemesi yapılabilir.
âequalsâ ve âhasCodeâ fonksiyonları doldurulmuÅ bir Book sınıfı tasarladık. Book nesnelerinden oluÅan bir veri kümesi oluÅturduk.
```java
public class Book implements Comparable {
private String name;
private String publisher;
private int publishYear;
private int pageCount;
private double price;
public Book(String name, String publisher, int publishYear, int pageCount, double price) {
this.name = name;
this.publisher = publisher;
this.publishYear = publishYear;
this.pageCount = pageCount;
this.price = price;
}
public String getName() {
return name;
}
public String getPublisher() {
return publisher;
}
public int getPublishYear() {
return publishYear;
}
public int getPageCount() {
return pageCount;
}
public double getPrice() {
return price;
}
@Override
public int compareTo(Book book) {
// doÄal sıralamayı kitap ismine göre yapıyoruz.
return this.getName().compareTo(book.getName());
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[");
builder.append(this.getName());
builder.append(" - ");
builder.append(this.getPublisher());
builder.append(" - ");
builder.append(this.getPublishYear());
builder.append(" - ");
builder.append(this.getPageCount());
builder.append(" - ");
builder.append(this.getPrice());
builder.append("]");
return builder.toString();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + pageCount;
long temp;
temp = Double.doubleToLongBits(price);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + publishYear;
result = prime * result + ((publisher == null) ? 0 : publisher.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (pageCount != other.pageCount)
return false;
if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
return false;
if (publishYear != other.publishYear)
return false;
if (publisher == null) {
if (other.publisher != null)
return false;
} else if (!publisher.equals(other.publisher))
return false;
return true;
}
}
```
```java
Set books = new HashSet();
books.add(new Book("Java Book", "Penguen Yayınevi", 2019, 500, 50));
books.add(new Book("Python Book", "Panda Yayınevi", 2012, 250, 45.5));
books.add(new Book("C# Book", "Elma Yayınevi", 2020, 660, 70));
books.add(new Book("Ruby Book", "Beyaz Balina Yayınevi", 2014, 450, 28));
books.add(new Book("Go Book", "Kanarya Yayınevi", 2017, 420, 80));
books.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
books.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
books.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
printAll(books);
```
### SortedSet interface (Arayüzü)
Set interfaceâden kalıtım almıÅtır. Setâin tanımladıÄı özelliklere ek olarak veri kümesi içerisindeki elemanların sıralanması, ilk son elemana eriÅim, bir elemandan önce-sonra gelen elemanların alınması gibi ek özellikleri de tanımlar. SortedSetâin en yaygın kullanıldıÄı alt sınıf âTreeSetâ sınıfıdır.
#### TreeSet Sınıfı
Veri kümesine konulan elemanların verdiÄiniz kurala göre sıralanmasını saÄlar. Bunun saÄlanabilmesi için kullanacaÄınız sınıfın âsıralanabilirâ olması gerekmektedir. Bir sınıfın sıralanabilir olması için âComparableâ interfaceâden kalıtım alıp âcompareToâ metodunu doldurması gerekmektedir. Nesne üzerindeki âcompareToâ fonksiyonu küçükten büyüÄe doÄal sıralama imkanı saÄlar.
EÄer sıralanabilir bir nitelik yoksa veya doÄal sıralama dıÅında deÄiÅik bir sıralama ile TreeSetâte elemanları saklamak istiyorsak, bu durumda âComparatorâ interfaceâden türemiÅ alt sınıflar oluÅturmak gerekecektir. Comparator sınıfları sıralama yapabilmeyi saÄlamaktadır. İçinde âcompareâ isimli bir fonksiyonu bulunur.
Yine Book sınıfını kullanarak örneÄimize devam edelim.
```java
Set yearSet = new TreeSet();
yearSet.add(2019l);
yearSet.add(2014l);
yearSet.add(2020l);
yearSet.add(2001l);
yearSet.add(2017l);
yearSet.add(2010l);
yearSet.add(2009l);
yearSet.add(2005l);
System.out.println("DoÄal bir Åekilde sıralanmıŠTreeSet");
printAll(yearSet);
Set books = new TreeSet();
books.add(new Book("Java Book", "Penguen Yayınevi", 2019, 500, 50));
books.add(new Book("Python Book", "Panda Yayınevi", 2012, 250, 45.5));
books.add(new Book("C# Book", "Elma Yayınevi", 2020, 660, 70));
books.add(new Book("Ruby Book", "Beyaz Balina Yayınevi", 2014, 450, 28));
books.add(new Book("Go Book", "Kanarya Yayınevi", 2017, 420, 80));
books.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
books.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
books.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
System.out.println("DoÄal bir Åekilde sıralanmıŠkitap listesi");
printAll(books);
Set sortedBooksByPublisher = new TreeSet(new BookComparatorByPublisher());
sortedBooksByPublisher.add(new Book("Java Book", "Penguen Yayınevi", 2019, 500, 50));
sortedBooksByPublisher.add(new Book("Python Book", "Panda Yayınevi", 2012, 250, 45.5));
sortedBooksByPublisher.add(new Book("C# Book", "Elma Yayınevi", 2020, 660, 70));
sortedBooksByPublisher.add(new Book("Ruby Book", "Beyaz Balina Yayınevi", 2014, 450, 28));
sortedBooksByPublisher.add(new Book("Go Book", "Kanarya Yayınevi", 2017, 420, 80));
sortedBooksByPublisher.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
sortedBooksByPublisher.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
sortedBooksByPublisher.add(new Book("Javascript Book", "ABC Yayınevi", 2010, 300, 20));
System.out.println("Comparator ile sıralanmıŠkitap listesi");
printAll(sortedBooksByPublisher);
```
İlk örnekte Long deÄerleri tutan bir TreeSet veri kümesi oluÅturduk. Long sınıfındaki "compareTo" metodu doldurulduÄu için küçük büyüÄe doÄal bir sıralama yapıyor.
İkinci örnekte ise Book sınıfından oluÅturulmuÅ nesneleri tutuyoruz. Book sınıfındaki compareTo metodu override edilmiÅ durumdadır. "compareTo" metodu kitapları isimlerine göre küçükten büyüÄe sıralayacak Åekilde doldurulmuÅtur. TreeSetâin kurucu metoduna herhangi bir Comparator nesnesi göndermezsek, nesneler üzerindeki doÄal sıralama metodunu kullanır. Bu örnekte de kitap isimlerine göre bir sıralama yapacaktır.
Ardından aynı örnekte "BookComparatorByPublisher" isminde "Comparator" interface'den kalıtım alan bir sıralayıcı geliÅtirdik. Bu sıralayıcı kitap nesnelerini yayınevi ismine göre küçükten büyüÄe doÄru sıralıyor.