RSS
Tidak ada Yang Tidak Mungkin Untuk Orang Yang Mau Berusaha
Text Select Onion Kun

Sabtu, 20 November 2010

(set) Himpunan dalam Java

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 . 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.

Tidak ada komentar:

Posting Komentar