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.
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. 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 komentar:
Posting Komentar