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 metodemap.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. Metodemap.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. MetodeList 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