Himpunan (set) adalah kumpulan Object yang mana tidak boleh ada dua dari objek yang sama di dalam
satu himpunan. Objek obj1 dan obj2 adalah objek yang sama jika obj1.equals(obj2) menghasilkan nilai true (lihat bagian sebelumnya untuk penjelasan tentang ini).
Set mengimplementasikan metode umum
pada Collection dengan sedikit modifikasi sehingga tidak memiliki objek
yang sama di dalamnya. Misalnya, jika set adalah objek bertipe Set maka set.add(obj) tidak
melakukan apa-apa jika obj sudah ada di dalam set.
Java memiliki dua kelas yang
mengimplementasikan interface Set, yaitu java.util.TreeSet
dan java.util.HashSet.
Selain sebagai Set, objek bertipe TreeSet
memiliki sifat di mana elemen-elemennya terurut dalam urutan menaik. Iterator dari suatu TreeSet akan mengunjungi elemen dalam set
tersebut dalam urutan menaik.
TreeSet tidak bisa menyimpan semua objek,
karena objek yang disimpan harus bisa diurutkan. Atau dengan kata iain, objek
yang disimpan dalam TreeSet harus mengimplementasikan interface
Comparable dan obj1.compareTo(obj2) harus bisa
membandingkan 2 objek obj1 dan obj2 dengan baik. Atau cara lainnya adalah dengan menggunakan Comparator yang bisa dimasukkan sebagai parameter dalam konstruktor
ketika TreeSet dibuat. Di sini Comparator digunakan untuk membandingkan objek yang akan dimasukkan di
dalam set.
Pada implementasi TreeSet, elemen di dalamnya disimpan dalam bentuk yang mirip dengan
pohon pengurutan biner (lihat bagian sebelumnya). Pohon yang digunakan bersifat
seimbang (balanced) yang artinya semua simpul
daunnya berjarak sama dari akar pohonnya. Dengan menggunakan pohon seimbang,
kita bisa memastikan bahwa kita bisa mencapai semua simpul daunnya dengan
secepat mungkin. Menambah dan mengurangi simpulnya juga bisa dilakukan dengan
cepat.
Karena TreeSet mengurutkan elemen-elemennya dan menjamin tidak ada
duplikasi objek, TreeSet sangat berguna untuk beberapa
aplikasi. Misalnya, kita akan membuat program untuk menghitung semua kata dalam
suatu artikel dan menampilkan semua kata yang ditemukan. List kata-kata dalam
artikel itu harus diurutkan, kemudian kata-kata yang sama dihapus. Dengan
menggunakan TreeSet, program tersebut dapat dibuat
dengan sangat mudah, menjadi :
TreeSet
kata = new
TreeSet();
while
masih ada data dari input :
kt = kata berikutnya dari input
kata.add(kt);
Iterator
iter = kata.iterator();
while (iter.hasNext()):
Tampikan iter.next() ke
layar.
Contoh lainnya, misalnya kol
adalah koleksi String (atau tipe lain yang
mengimplementasikan compareTo()). Kita bisa
menggunakan TreeSet untuk mengurutkan item dari kol
dan menghapus duplikasi dengan :
TreeSet
set = new
TreeSet();
set.addAll(kol);
Perintah baris kedua di atas
menambah semua elemen dari kol ke dalam set. Karena berbentuk Set,
maka duplikasi akan dihapus. Karena berbentuk TreeSet
maka semua elemennya akan terurut. Jika kita ingin data tersebut disimpan dalam
struktur data lain, kita bisa mengubahnya dengan mudah. Misalnya, untuk membuat
ArrayList dari TreeSet, bisa kita tulis dengan :
TreeSet
set = new
TreeSet();
set.addAll(kol);
ArrayList
list = new
ArrayList();
list.addAll(set);
Sebetulnya, kelas koleksi Java
memiliki konstruktor yang bisa mengambil parameter berbentuk Collection. Semua item dalam Collection
ditambahkan ke dalam koleksi baru ketika dibuat. Jadi new TreeSet(kol) membuat TreeSet yang memiliki elemen yang sama
seperti koleksi kol.
Atau kita bisa menyingkat keempat
baris kode di atas dalam satu baris kode :
ArrayList
list = new
ArrayList(
new TreeSet(kol) );
Hasilnya adalah list terurut dengan
elemen dari kol tanpa duplikasi. Ini adalah contoh dari keampuhan
pemrograman generik.
(Sepertinya tidak ada struktur data
list dengan duplikasi pada Java, atau TreeSet
yang membolehkan duplikasi. Pada bahasa pemrograman C++ struktur data ini
disebut multiset. Pada bahasa Smalltalk,
struktur data seperti ini disebut bag (kantong).
Pada Java, untuk saat ini, tidak ada struktur data seperti ini.)
HashSet mengimplementasikan tabel hash yang akan kita bahas di bagian berikutnya.
Operasi penambahan, pencarian, dan penghapusan dilakukan dengan sangat efisien
pada tabel hash, bahkan lebih cepat lagi dari TreeSet.
Elemen pada HashSet tidak disimpan dalam urutan
tertentu.
Iterator dari HashSet
akan mengunjungi elemen-elemen pada HashSet
dalam urutan yang sepertinya acak dan mungkin berubah jika elemen baru
ditambahkan.
Karena elemen pada HashSet tidak diurutkan, maka semua objek (termasuk yang tidak
mengimplementasikan interface Comparable) bisa dimasukkan dalam HashSet. Kita bisa menggunakan HashSet
jika elemen yang kita akan masukkan tidak bisa dibandingkan, atau urutannya
tidak penting, atau jika kecepatan lebih dipentingkan.
0 comments:
Post a Comment