Kamis, 16 Mei 2013

Tampilan Subset dan Submap

Map sebenarnya bukan merupakan Collection, artinya map tidak mengimplementasikan semua operasi yang didefinisikan pada interface Collection, karena map tidak memiliki iterator. Akan tetapi, Java memiliki cara lain untuk melakukan penelusuran item pada map.
Jika map adalah variabel bertipe Map, maka metode

map.keySet()
 
akan mengembalikan semua objek kunci pada map. Karena di dalam map tidak ada kunci yang sama, maka hasilnya akan dikembalikan dalam bentuk Set. Hasil yang dikembalikan oleh map.keySet() disebut tampilan (view) dari objek-objek yang disimpan di dalam map.

"Tampilan" yang dikembalikan metode ini berhubungan langsung dengan map aslinya, artinya jika kita menghapus elemen dari dalam tampilan ini, maka kunci beserta nilai yang ditunjuk di dalam map akan juga dihapus. Tampilan tidak bisa digunakan untuk menambah data, karena fungsinya hanya sebagai tampilan. Karena map.keySet() tidak membuat set baru, maka perintah ini akan cukup efisien untuk digunakan pada map yang sangat besar sekalipun.

Kita bisa menggunakan iterator untuk melakukan penelusuran isi Set. Kita bisa juga menggunakan iterator untuk kunci dari map, kemudian menelusurinya, misalnya :

Set kunci = map.keySet();         // Set kunci dari map
Iterator kunciIter = kunci.iterator();
System.out.println("Map ini memiliki asosiasi sebagai berikut:");
while (kunciIter.hasNext()) {
    Object knc = kunciIter.next();  // Ambil kunci berikut
    Object nilai = map.get(knc);  // Ambil nilai yang ditunjuk oleh kunci
    System.out.println( "   (" + knc + "," + nilai + ")" );
}
 
Jika map adalah suatu TreeMap, maka set kuncinya adalah set yang terurut, dan iteratornya akan mengunjungi kunci-kuncinya dalam urutan menaik.

Interface Map memiliki 2 jenis tampilan lain. Jika map adalah variabel bertipe Map, maka metode :

map.values()
 
mengembalikan Collection yang berisi semua nilai yang disimpan dalam map. Nilai kembaliannya bukan Set karena suatu map bisa berisi nilai yang sama. Metode

map.entrySet()
 
mengembalikan Set yang berisi asosiasi (kunci dan nilainya) di dalam map. Informasi dalam kelas ini sama dengan informasi dalam map itu sendiri, akan tetapi Set yang dikembalikan menampilkan jenis informasi yang berbeda. Setiap elemen dalam set ini adalah objek bertipe Map.Entry (Kelas ini adalah kelas statik bertingkat, sehingga namanya memiliki tanda titik. Akan tetapi tetap bisa digunakan sebagaimana kelas-kelas lainnya).

Objek Map.Entry berisi hanya satu pasangan kunci dan nilai, dan memiliki metode getKey() dan getValue() untuk mengambil kunci dan nilainya. Ada juga metode setValue(nilai) untuk mengisi nilainya. Kita bisa menggunakan set ini untuk mencetak semua pasangan kunci dan nilainya, yang lebih efisien daripada menggunakan kunci kemudian mengambil kembali isinya dari dalam map seperti contoh di atas.
Sehingga kita bisa membuat fungsi yang sama dengan di atas dengan lebih efisien, yaitu

Set entri = map.entrySet();
Iterator entriIter = entri.iterator();
System.out.println("Map ini berisi asosiasi sebagai berikut:");
while (entriIter.hasNext()) {
    Map.Entry pasangan = (Map.Entry)entriIter.next();
    Object kunci = pasangan .getKey();  // Ambil kunci dari pasangan
    Object nilai = pasangan .getValue();  // Ambil nilainya
    System.out.println( "   (" + kunci + "," + nilai + ")" );
}
 
Map bukan satu-satunya tempat di mana tampilan bisa diambil. Misalnya, interface List memiliki sublist yang untuk melihat sebagian isi list. Metode

List subList(int indeksAwal, int indeksAkhir)
 
mengembalikan sebagian list yang terdiri dari elemen pada posisi antara indeksAwal hingga indeksAkhir (termasuk indeksAwal tapi tidak termasuk indeksAkhir.) Tampilan ini memungkinkan kita untuk melakukan operasi apapun seperti pada list biasa, akan tetapi sublist bukan list terpisah. Perubahan yang dilakukan pada sublist akan juga mempengaruhi list aslinya.

Begitu juga dengan set, kita bisa membuat tampilan yang merupakan subset dari suatu set. Jika set adalah suatu TreeSet, maka set.subSet(dariElemen, hinggaElemen) mengembalikan [code]Set yang berisi elemen-elemen set antara dariElemen hingga hinggaElemen (termasuk dariElemen tapi tidak termasuk hinggaElemen).

Misalnya, jika kata adalah suatu TreeSet di mana semua elemennya adalah String berisi huruf kecil, maka kata.subSet("m", "n") akan berisi semua elemen pada kata yang dimulai dari huruf m. Subset ini adalah tampilan yang merupakan bagian dari set aslinya. Artinya membuat subset tidak mengkopi elemen, dan perubahan pada subset (misalnya penambahan dan pengurangan elemen) juga mempengaruhi set aslinya.
Tampilan set.headSet(hinggaElemen) berisi semua elemen dari set yang kurang dari [code]hinggaElemen, dan set.tailSet(dariElemen) adalah tampilan yang berisi semua elemen yang lebih besar atau sama dengan dariElemen.

Kelas TreeMap memiliki tiga tampilan submap. Submap mirip dengan subset. Submat adalah Map yang berisi subset dari kunci dan nilai pada Map aslinya. Jika map suatu variabel bertipe TreeMap, maka map.subMap(dariKunci, hinggaKunci) mengembalikan tampilan yang berisi semua pasangan kunci/nilai dari map yang kuncinya ada di antara dariKunci dan hinggaKunci (termasuk dariKunci tapi tidak termasuk hinggaKunci).

Ada juga tampilan map.headMap(hinggaKunci) dan map.tailMap(dariKunci) seperti aturan pada subset.

Misalnya, bukuHitam adalah suatu TreeMap di mana kuncinya adalah nama dan nilainya adalah nomor telepon. Kita bisa mencetak semua entri pada bukuHitam yang namanya dimulai dengan "M" seperti berikut :

Map ems = bukuHitam.subMap("M","N");
 
// Submap ini berisi semua elemen di mana kuncinya lebih
// besar dari "M" dan kurang dari (tapi tidak termasuk) "N"
if (ems.isEmpty())
    System.out.println("Tidak ada elemen yang dimulai dengan M.");
else {
    Iterator iter = ems.entrySet().iterator();
    // Iterator ini akan menelusuri entri pada submap ems
    while (iter.hasNext()) {
        // Get the next entry and print its key and value.
        Map.Entry entri = iter.next();
        System.out.println( entri.getKey() + ": " + entri.getValue() );
    }
}
 
Subset dan submap mungkin menjadi cara terbaik untuk melakukan pencarian, sehingga kita bisa mencari elemen pada rentang nilai tertentu, bukan hanya pencarian satu nilai saja. Misalnya pada database disimpan jadwal yang disimpan dalam bentuk TreeMap di mana kuncinya adalah waktu, dan misalnya kita ingin mencari semua item yang terjadwal 1 Maret 2009. Kita hanya perlu membuat submap yang berisi semua kunci antara 00:00 1 Maret 2009 hingga 00:00 2 Maret 2009 kemudian mencetak isi submap tersebut. Tipe pencarian seperti ini disebut pencarian rentang (subrange query).

Tidak ada komentar:

Posting Komentar