Minggu, 19 Mei 2013

JAVA - Pemrograman Genetik Pada Java (Koleksi dan Map)


MAP
Struktur data generik pada Java dapat dibagi menjadi dua kategori : koleksi dan map. Koleksi kurang lebih mirip seperti kumpulan objek-objek. Map menghubungkan objek di satu kumpulan dan objek di kumpulan lain seperti kamus yang menghubungkan definisi dengan kata atau buku telepon menghubungkan nama dan nomor telepon. Map mirip dengan apa yang kita sebut "list asosiasi" pada bagian sebelumnya.

Ada dua jenis koleksi : list dan himpunan (set). List adalah kumpulan objek di mana item-itemnya diatur secara berurutan. List memiliki item pertama, item kedua, dan seterusnya. Untuk item di dalam list, kecuali item terakhir, akan ada item yang ada di belakangnya.
Himpunan (set) adalah kumpulan objek di mana hanya ada satu objek yang bisa ada di dalam suatu himpunan.

Lihat bahwa istilah "koleksi", "list", "himpunan", dan "map" tidak menyatakan bagaimana data disimpan. List bisa diimplementasikan dalam bentuk array, list berantai, atau map yang menghubungkan elemen list dengan angka 0, 1, 2, ....

Sebetulnya istilah-istilah ini dibuat pada Java bukan dalam bentuk kelas tapi dalam bentuk interface.Interface

  1. Collection
  2. List
  3. Set
  4. Map

 
mendefinisikan operasi dasar dari struktur data tersebut, tapi tidak menjelaskan bagaimana struktur data dan operasinya diimplementasikan.

Struktur data dan operasinya akan ditulis pada kelas yang mengimplementasikan interface tersebut. Bahkan ketika kita menggunakan kelas tersebut, kita mungkin tidak tahu bagaimana kelas tersebut diimplementasikan, kecuali kita melihat langsung pada kode sumbernya. Struktur data generik pada Java adalah tipe data abstrak (abstract data type). Mereka memiliki definisi operasi yang bisa dilakukan, dan bukan bagaimana data diatur dalam memori komputer.

Kita akan lihat kelas list, set dan map pada bagian berikut. Tapi sebelum kita sampai pada bagian itu, kita akan melihat dahulu beberapa konsep tentang operasi umum yang tersedia pada semua koleksi.

Kelas Map

Suatu array yang berisi N elemen bisa juga dilihat sebagai asosiasi (pemetaan) antara elemennya dengan bilangan 0, 1, ..., N-1 yang merupakan indeksnya. Jika i adalah salah satu bilangan ini, maka kita bisa mengambil elemen yang dipetakan oleh bilangan i, dan juga kita bisa meletakkan elemen baru pada posisi ke-i.
Suatu peta (map) adalah generalisasi dari array. Seperti array, map juga memiliki operasi untuk mengambil dan meletakkan elemen. Akan tetapi pada map, operasi ini tidak dilakukan pada bilangan 0, 1, ... N-1, akan tetapi pada sembarang Object.
Beberapa bahasa pemrograman menggunakan istilah array asosiatif (associative array) karena kesamaan perintah dengan array biasa. Pada bahasa pemrograman tersebut, kita bisa menuliskan A["joko"] yang digunakan untuk memetakan "joko" pada suatu elemen di dalam array.
Java tidak menggunakan perintah yang sama pada map, akan tetapi idenya serupa : Map adalah seperti array yang indeksnya adalah objek sembarang, bukan integer. Pada map, objek yang digunakan sebagai "indeks" disebut kunci (key). Objek yang ditunjuk oleh indeks tersebut disebut nilai (value).
Satu kunci hanya boleh menunjuk pada satu nilai, akan tetapi satu nilai bisa ditunjuk oleh beberapa kunci.
Dalam Java, map didefinisikan dalam interface java.util.Map, yang memiliki beberapa metode untuk bekerja dengan map. Jika map adalah variabel dengan tipe Map, maka berikut ini adalah beberapa metodenya :
  • map.get(kunci) -- mengembalikan Object yang ditunjuk oleh kunci. Jika map tidak memiliki nilai yang ditunjuk oleh kunci, maka nilai null akan dikembalikan. Tapi ingat juga bahwa mungkin saja kuncinya ada akan tetapi memang menunjuk pada nilai null. Menggunakan "map.get(kunci)" sama dengan perintah "A[kunci]" pada array A. (Akan tetapi pada map tidak ada pengecualian IndexOutOfBoundsException)
  • map.put(kunci, nilai) -- Mengisi map dengan pasangan kunci dan nilai. Kedua-dua kunci dan nilai bisa berupa objek apa saja. Jika map tersebut telah memiliki kunci maka nilai yang ditunjuk akan diganti dengan yang baru diberikan. Perintah ini mirip dengan "A[kunci] = nilai" pada array.
  • map.putAll(map2) -- jika map2 adalah map lain, maka perintah ini akan mengkopi semua isi pada map2 ke dalam map.
  • map.remove(kunci) -- Jika map memiliki kunci yang menunjuk pada suatu nilai, perintah ini akan menghapus kunci beserta nilai yang ditunjuknya, atau dengan kata lain menghapus pasangan kunci dan nilai pada map sekaligus.
  • map.containsKey(kunci) -- mengembalikan nilai boolean true jika map memiliki kunci yang merujuk pada suatu nilai
  • map.containsValue(nilai) -- mengembalikan nilai boolean true jika map memiliki nilai yang ditunjuk oleh kunci apapun.
  • map.size() -- mengembalikan int yang berisi jumlah pasangan asosiasi pada map.
  • map.isEmpty() -- mengembalikan boolean true jika map tidak berisi pasangan asosiasi apa-apa.
  • map.clear() -- menghapus semua pasangan asosiasi dalam map.
Metode put dan get jelas merupakan metode yang paling sering digunakan dalam map. Dalam banyak aplikasi, metode ini mungkin hanya metode ini yang kita butuhkan. Artinya, menggunakan map sama mudahnya dengan menggunakan array biasa.
Java memiliki dua kelas yang mengimplementasikan interface Map, yaitu : TreeMap dan HashMap.
Dalam TreeMap, pasangan kunci/nilai disimpan secara berurutan dalam pohon terurut, yaitu diurut berdasarkan kuncinya. Supaya bisa bekerja dengan benar, maka hanya objek yang bisa dibandingkan saja yang bisa digunakan sebagai kunci. Artinya kelas kunci harus berupa kelas yang mengimplementasikan interface Comparable, atau Comparator harus diberikan pada konstruktornya pada saat TreeMap dibuat.
HashMap tidak menyimpan pasangan kunci/nilai dalam urutan tertentu, sehingga tidak ada batasan objek apa yang bisa disimpan di dalamnya. Hampir semua operasi dapat berjalan lebih cepat pada HashMap dibandingkan dengan TreeMap.
Secara umum, lebih baik menggunakan HashMap kecuali kita butuh struktur data dalam urutan tertentu yang hanya bisa dilakukan dengan TreeMap. Atau dengan kata lain, jika kita hanya menggunakan perintah put dan get, gunakan HashMap.
Misalnya progrma direktori telefon, yaitu pada kelas BukuTelepon yang memiliki pasangan nama/nomor telepon. Kelas ini memiliki operasi tambahEntri(nama, nomor) dan ambilNomor(nama), di mana nama dan nomor bertipe String.
Dalam aplikasi pemrograman sebenarnya, kita tidak perlu lagi membuat kelas baru untuk mengimplementasikan BukuTelepon tersebut, artinya kita bisa langsung menggunakan Map. Akan tetapi menggunakan Map mungkin memiliki sedikit kerugian, karena kita dipaksa harus menggunakan Object bukan String.
Jika ini masalahnya, maka kita bisa membuat kelas baru yang menggunakan Map dalam implementasinya, seperti berikut :

import java.util.HashMap;
 
public class BukuTelepon {
 
    // Menyimpan data telepon
    private HashMap info = new HashMap();
 
    public void tambahEntri(String nama, String nomor) {
        // Menyimpan nomor telepon pada nama yang sesuai
        info.put(nama,nomor);
    }
 
    public String ambilNomor(String nama) {
        // Mengambil nomor telepon dari nama
        // Kembalikan null jika tidak ada nomor telepon untuk nama tsb
        return (String)info.get(nama);
    }
 
} // akhir kelas BukuTelepon
 
Dalam metode ambilNomor di atas, nilai kembalian dari info.get(nama) di-type-cast ke dalam String. Karena kembalian dari metode get() bertipe Object maka type cast menjadi penting sebelum nilainya bisa digunakan.
Dengan "membungkus" Map di dalam kelas BukuTelepon, kita menyembunyikan type-cast dalam implementasinya sehingga interaksi kelas ini dengan kelas lain yang menggunakannya menjadi lebih natural.

Sumber : http://java.lyracc.com/belajar/java-untuk-pemula/kelas-map
 

 

Tidak ada komentar:

Posting Komentar