OOP: Java Advanced Romi Satria Wahono romi@romisatriawahono.net http://romisatriawahono.net 0815-8622-0090
Romi Satria Wahono SD Sompok Semarang (1987) SMPN 8 Semarang (1990) SMA Taruna Nusantara, Magelang (1993) S1, S2 dan S3 (on-leave) Department of Computer Sciences Saitama University, Japan (1994-2004) Research Interests: Software Engineering, Intelligent Systems Founder dan Koordinator IlmuKomputer.Com Peneliti LIPI (2004-2009) Founder dan CEO PT Brainmatics Cipta Informatika
Materi OOP Concepts: Konsep dan Paradigma Object-Oriented Java Fundamentals: Memahami Sintaks dan Grammar Bahasa Java Java GUI: Swing, GUI Component, Event Handling, Studi Kasus Aplikasi GUI Java Advanced: Eksepsi, Thread, Java API, Collection, Algorithms Java Database: Koneksi ke Database, Studi Kasus Aplikasi Database
Java Advanced Penanganan Eksepsi Thread dan Multithreading I/O Stream Operasi Berkas (File) Struktur Data dengan Collection Sorting and Searching Algorithms
Penanganan Eksepsi romi@romisatriawahono.net Object-Oriented Programming Penanganan Eksepsi http://romisatriawahono.net
Eksepsi Eksepsi adalah kondisi abnormal yang terjadi pada saat suatu perintah dieksekusi Ketika eksepsi terjadi pada suatu method, ada dua pilihan yang dapat dilakukan: Menangani sendiri eksepsi Meneruskannya ke luar (throw) Keyword eksepsi: try, catch, finally, throw,throws
Bentuk Penanganan Eksepsi try{ // code yg mengakibatkan eksepsi }catch(TipeEksepsi1 objekEksepsi){ // code utk menangani eksepsi yg cocok dg TipeEksepsi1 } ... catch(TipeeksepsiN objekEksepsi){ // code utk menangani eksepsi yg cocok dg TipeEksepsiN }finally{ //code yg pasti dieksekusi setelah blok try-catch dieksekusi
Hirarki Class Eksepsi
3 Tipe Eksepsi Eksepsi yang Tidak Dicek Error Eksepsi yang Dicek
Tipe Eksepsi Yang Tidak Dicek Semua eksepsi bertipe RuntimeException dan turunannya tidak harus secara eksplisit ditangani dalam program. Contohnya: ArrayIndexOutofBoundException, AritmeticException, dsb Program dengan eksepsi ini tetap dapat dikompilasi, meskipun ketika dijalankan akan mengeluarkan pesan eksepsi dan eksekusi berakhir Supaya eksekusi tidak berakhir, bisa menggunakan blok try-catch
DemoEksepsi.java class DemoEksepsi{ public static void main(String[] args){ int[] arr = new int[1]; System.out.println(arr[1]); }
Tipe Eksepsi Error Tipe eksepsi yang seharusnya tidak ditangani dengan blok try-catch karena berhubungan dengan Java runtime system Error merupakan eksepsi yang sangat kritis dan tidak perlu ditangani oleh program kita
Tipe Eksepsi Yang Dicek Semua eksepsi yang bukan turunan class RuntimeException adalah eksepsi yang harus ditangani dengan blok try-catch Program tidak bisa dikompilasi apabila eksepsi tidak ditangani
DemoEksepsi2.java class DemoEksepsi2{ Public static void main(String[] args){ File myFile = new File(“test.txt”); myFile.createNewFile(); }
DemoEksepsi3.java class DemoEksepsi3{ public static void main(String[] args){ try{ File myFile = new File("test.txt"); myFile.createNewFile(); System.out.println("File berhasil dibuat"); }catch(IOException e){ System.out.println(“File gagal dibuat"); }
Mengapa Eksepsi Perlu Ditangani Kita ingin program kita bisa memperbaiki kesalahan akibat eksepsi dan terus melanjutkan eksekusi seolah-olah tidak pernah terjadi eksepsi Pengguna program(software) umumnya tidak peduli (mengerti) bagaimana sebuah program dieksekusi sehingga akhirnya muncul pesan kesalahan. Kita ingin pesan kesalahan tadi dipahami oleh pengguna Kita ingin program tetap berjalan dan bukannya dihentikan pada saat eksepsi terjadi
Catch Bertingkat Code yang ada dalam blok try bisa saja mengakibatkan lebih dari satu jenis eksepsi Kita dapat menuliskan lebih dari satu blok catch untuk setiap blok try Blok catch dengan tipe data subclass harus ditulis terlebih dahulu daripada tipe data superclass-nya Exception adalah superclass dari ArithmeticException dan ArrayIndexOutOfBoundsException sehingga harus ditulis paling akhir
DemoEksepsi4.java class DemoEksepsi4{ public static void main(String[] args){ try{ int x = args.length; int y = 100/x; int[] arr = {0,1,2,3}; y = arr[x]; System.out.println("Jumlah argument: " + y); System.out.println("Tidak terjadi eksepsi"); }catch(ArithmeticException e){ System.out.println("Terjadi eksepsi karena pembagian dengan nol“ + e.getMessage()); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Terjadi eksepsi karena indeks di luar kapasitas"); }catch(Throwable e){ System.out.println("Terjadi eksepsi yg tidak diketahui"); } System.out.println("Setelah blok try catch");
DemoEksepsi5.java class DemoEksepsi5{ public static void main(String[] args){ double BILANGAN = 100.0; System.out.println("Sebelum pembagian"); for(int i=5; i>=0; i--){ try{ System.out.println(BILANGAN + "/" + i + " = "); System.out.println(BILANGAN/i); }finally{ System.out.println("Bagian finally dijalankan"); } System.out.println("Program selesai");
Melontarkan Eksepsi (throw) Keyword throw digunakan untuk melontarkan eksepsi Bentuk: throw variabelObjek;
DemoThrow.java class DemoThrow{ public static void main(String[] args){ RuntimeException r = new RuntimeException("Eksepsi RuntimeException"); System.out.println("Sebelum Throw"); throw(r); }
throws untuk Eksepsi Method Keyword throws digunakan untuk memberitahu bahwa suatu method ada kemungkinan menghasilkan suatu eksepsi Bentuk: public tipe namaMethod() throws JenisEksepsi{ ... } atau public tipe namaMethod() throws JenisEksepsi1, JenisEksepsi2, JenisEksepsi3...{
DemoThrows.java class SuatuKelas{ // Method tanpa throws public void metodeA(){ System.out.println(“MetodeA”); } // Method dengan throws public void metodeB() throws IOException{ System.out.println(“MetodeB”); class DemoThrows{ public static void main(String[] args){ SuatuKelas obj = new SuatuKelas(); obj.metodeA(); obj.metodeB(); }
DemoThrows2.java class SuatuKelas{ public void metodeA(){ System.out.println("MetodeA"); } public void metodeB() throws IOException{ System.out.println("MetodeB"); public class DemoThrows{ public static void main(String[] args){ SuatuKelas obj = new SuatuKelas(); obj.metodeA(); obj.metodeB(); }
Thread dan Multithreading romi@romisatriawahono.net Object-Oriented Programming Thread dan Multithreading http://romisatriawahono.net
Konsep Thread Thread: sekumpulan instruksi (proses) yang dieksekusi secara independen Multithreading: suatu kemampuan yang memungkinkan beberapa kumpulan instruksi (proses) dijalankan secara bersamaan (time slicing) dalam sebuah program Multithreading bermanfaat untuk membuat proses yang interaktif, misalnya pada program permainan (game). Program tetap dapat menggerakkan beberapa objek sambil memberi kesempatan pengguna melakukan respon melalui mouse atau keyboard
Penggunaan Thread Membuat class yang mengimplementasi interface Runnable dan method run() class NamaClass implements Runnable{ public void run(){ ... } } 2. Membuat class yang merupakan turunan class Thread dan meng-override method run() class NamaClass extends Thread {
Kiat Memilih Penggunaan Thread Jika perlu meng-override beberapa method milik class Thread gunakan turunan class Thread Teknik mengimplementasi interface Runnable harus digunakan, jika kita membuat class yang merupakan turunan dari class lain. Karena java tidak mengenal multiple inheritance, teknik membuat turunan class Thread tidak bisa digunakan
ThreadBeraksi1.java class Mobil implements Runnable{ String nama; public Mobil(String id){ nama = id; } public void run(){ for(int i=0;i<5; i++){ try{ Thread.currentThread().sleep(1000); }catch(InterruptedException ie){ System.out.println("Terinterupsi"); System.out.println("Thread" + nama + ": Posisi " +i); }} public class ThreadBeraksi1{ public static void main(String[] args){ Thread m1 = new Thread(new Mobil("M-1")); Thread m2 = new Thread(new Mobil("M-2")); m1.start(); m2.start();
ThreadBeraksi2.java class Mobil extends Thread{ public Mobil(String id){ super(id); } public void run(){ String nama = getName(); for(int i=0; i<5; i++){ try{ sleep(1000); }catch(InterruptedException ie){ System.out.println("Terinterupsi"); System.out.println("Thread" + nama + ": Posisi " +i); }} public class ThreadBeraksi2{ public static void main(String[] args){ Mobil m1 = new Mobil("M-1"); Mobil m2 = new Mobil("M-2"); m1.start(); m2.start();
Method Class Thread Method Deskripsi static Thread currentThread() Cek di Java API String getName() int getPriority() Boolean isAlive() void join() void join(long millis) void run() String setName() static void sleep(longmillis) static void sleep(longmillis, int nanos) void start()
Method isAlive() Method isAlive() digunakan untuk mengetahui apakah suatu thread masih hidup atau sudah mati Method isAlive() memberikan nilai balik true apabila thread masih hidup dan false apabila sudah mati (return value = boolean)
ThreadBeraksi3.java Tambahkan code di bawah pada method main pada class ThreadBeraksi2, ubah class menjadi ThreadBeraksi3 boolean m1Berakhir = false; boolean m2Berakhir = false; do{ if(!m1Berakhir && !m1.isAlive()){ m1Berakhir = true; System.out.println(“Thread m1 berakhir”); } if(!m2Berakhir && !m2.isAlive()){ m2Berakhir = true; System.out.println(“Thread m2 berakhir”); } while (!m1Berakhir || !m2Berakhir);
Sinkronisasi Pada berapa kondisi, proses secara bersamaan terkadang tidak memungkinkan Contoh: proses I/O stream khususnya pada proses membaca dan menulis suatu data atau file Proses thread pembacaan atau penulisan data menjadi tidak benar karena seharusnya data dan file tersebut berubah-ubah (sedang dibuka dan ditulis oleh thread lain) Untuk kondisi diatas perlu dilakukan proses sinkronisasi dengan menggunakan keyword synchronized
Cara Penggunaan Synchronized Sinkronisasi pada method: mendeklarasikan suatu method dengan menggunakan keyword synchronized Sinkronisasi pada objek: menambahkan blok di bawah pada pemanggilan objek synchronized (objek){ ... }
Sinkronisasi pada Method (ThreadBeraksi4.java) Pada ThreadBeraksi2.java, ubah run() pada class Mobil: public void run(){ String nama = getName(); SinkronisasiKeluaran.info(nama); } 2. Buat class SinkronisasiKeluaran dengan code: class SinkronisasiKeluaran{ public static synchronized void info(String nama){ for(int i=0; i<5; i++){ try{ Thread.sleep(1000); }catch(InterruptedException ie){ System.out.println("Terinterupsi");} System.out.println("Thread" + nama + ": Posisi " +i); }}}
Sinkronisasi pada method (ThreadBeraksi5.java) Pada ThreadBeraksi4.java, ubah method run() pada class Mobil: public void run(){ synchronized(this){ String nama = getName(); SinkronisasiKeluaran.info(nama); }
Prioritas Thread Method setPriority(int level) dapat dipanggil untuk menentukan prioritas dari thread Nilai level bisa berupa bilangan bulat dari 1-10 Prioritas normal memiliki nilai level 5 Perlu dicatat bahwa tidak semua sistem operasi mendukung operasi ini, sehingga kadang pemanggilan method ini tidak memberikan efek apa-apa
ThreadBeraksi6.java class Mobil extends Thread{ public Mobil(String id){ super(id); } public void run(){ String nama = getName(); for(int i=0; i<5; i++){ System.out.println(“Thread” + nama + “: Posisi “ +i); }}} public class ThreadBeraksi6{ public static void main(String[] args){ Mobil m1 = new Mobil(new Mobil(“M-1”)); Mobil m2 = new Mobil(new Mobil(“M-2”)); m2.setPriority(8); m1.start(); m2.start(); }}
I/O Stream
Apa Itu I/O Stream Stream adalah proses membaca data dari suatu suatu sumber (input) atau mengirimkan data ke suatu tujuan (output) System.out.println() adalah contoh stream, yang berfungsi menampilkan data (informasi) ke layar Variabel standard stream: System.in (default: keyboard) System.out (default: layar) System.err (default: console)
Konsep I/O Stream (Input)
Konsep I/O Stream (Output)
Jenis I/O Stream Byte Stream Character Stream Untuk menulis atau membaca data biner InputStream dan OutputStream adalah dua class abstrak tertinggi dari Byte Stream Character Stream Untuk menulis dan membaca data karakter (unicode) Reader dan Writer adalah dua class abstrak tertinggi dari Character Stream
1. Byte Stream
Class Turunan Byte Stream Deskripsi BufferedInputStream BufferedOuputStream ByteArrayInputStream ByteArrayOuputStream DataInputStream DataOutputStream FileInputStream FileOutputStream PrintStream
Method Class InputStream Deskripsi int available() void close() void mark(int readLimit) booleanmarkSupported() int read() int read(byte[] b) int read(byte[] b, int off, int len) void reset() long skip(long n)
Membaca Input dari Console class InputStreamBeraksi{ public static void main(String[] args) throws IOException{ byte[ ] data = new byte[10]; System.out.println("Ketik 10 buah karakter:"); System.in.read(data); System.out.println("Karakter yang anda ketik adalah:"); for(int i=0; i<data.length; i++){ System.out.print((char) data[i]); }
Membaca Input dari File import java.io.*; class FileInputStreamBeraksi{ public static void main(String[] args) { if (args.length==0) { System.out.println("Masukkan nama file sebagai parameter!"); } byte data; FileInputStream fin=null; try{ fin = new FileInputStream(args[0]); do{ data = byte)fin.read(); System.out.print((char)data); }while(data!=-1); }catch(FileNotFoundException e){ System.out.println("File: " + args[0] + "tidak ditemukan."); }catch(IOException e){ System.out.println("Ekspresi tidak diketahui : " + e) ; }finally{ if(fin!=null){ try{ fin.close(); }catch(IOException err){ System.out.println("Ekspresi tidak diketahui : " + err);} }}}}
Method Class OutputStream Deskripsi void close() void flush() void write(byte[] b) void write(byte[] b, int off, int len) abstract void write(int b)
Menulis Output ke Console class OutputStreamBeraksi{ public static void main(String[] args) throws IOException{ byte[] data = {'a','b','c','d','e','f','g'}; System.out.write(data,3,4); System.out.write('\n'); System.out.write(data); }
Menulis Output ke File class FileOutputStreamBeraksi{ public static void main (String[] args) { if (args.length==0) {System.out.println("Error: tulis nama file!");} byte data; OutputStream fout=null; try{ fout = new FileOutputStream(args[0]); System.out.println ("Ketik data yang ingin Anda tulis ke file. Q untuk berhent"); data = (byte)System.in.read(); while(data!=(byte)'Q') { fout.write(data); } }catch(FileNotFoundException e) { System.out.println("file : " + args[0] + " tidak dapat dibuka atau dibuat."); }catch(IOException e) { System.out.println("Ekspresi tidak diketahui : " + e); }finally { if(fout!=null) { try{ fout.close(); }catch(IOException err) { System.out.println("Ekspresi tidak diketahui : " + err); }}}}}
Program Copy Isi File (Byte) public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("filesumber.txt"); out = new FileOutputStream("filetujuan.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } }}}
Proses dalam CopyBytes.java
2. Character Stream
Class Turunan Character Stream BufferedReader BufferedWrite CharArrayReader CharArrayWriter InputStreamReader OutputStreamWriter FileReader FileWriter PrintWriter StringReader StringWriter
Method Class Reader Method Deskripsi abstract void close() void mark(int readAheadlimit boolean markSupported() int read() int read(char[] cbuf) abstract int read(char[] cbuf, int off, int len) void reset() long skip(long n)
Membaca Input dari Console (Karakter) class CharReaderBeraksi{ public static void main(String[] args) throws IOException{ char data; String str = ""; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ketik sejumlah karakter, akhiri dg Q"); data =(char) br.read(); while(data!='Q'){ str += data; data = (char) br.read(); } System.out.println("Karakter yang anda ketik: " + str);
Membaca Input dari Console (Baris) -1- class LineReaderBeraksi{ public static void main(String[] args) throws IOException{ String hasil = ""; String str; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ketik sejumlah string dan akhiri dengan KELUAR"); str = br.readLine(); while(!str.equals("KELUAR")){ hasil += str + '\n'; } System.out.println(); System.out.println("String yang anda ketik: " + hasil);
Method Class Writer Method Deskripsi abstract void close() abstract void flush() void write(char[] cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int len)
Menulis Output ke Console import java.io.*; class WriterBeraksi{ public static void main(String[] args) throws IOException{ PrintWriter pw = new PrintWriter(System.out,true); pw.println("Menulis ke console dengan karakter stream"); }
Menulis Output ke File class FileWriterBeraksi{ public static void main (String[] args) { if (args.length==0){ System.out.println("Error: tulis nama file!");} String data; FileWriter fout=null; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); try{ fout = new FileWriter(args[0]); System.out.println("Ketik data ke file.Ketik BERHENTI untuk berhenti"); data = br.readLine(); while(!data.equals("BERHENTI")) { fout.write (data + "\r\n"); data = br.readLine();} }catch(FileNotFoundException e) { System.out.println("File : " + args[0] + " tidak dapat dibuka atau dibuat."); }catch(IOException e) { System.out.println("Ekspresi tidak diketahui : " + e); }finally { if(fout!=null) { try{ fout.close(); }catch(IOException err) { System.out.println("Ekspresi tidak diketahui : " + err); }}}}}
Program Copy Isi File (Character) public class CopyCharacters { public static void main(String[] args) throws IOException { FileReader inputStream = null; FileWriter outputStream = null; try { inputStream = new FileReader("filesumber.txt"); outputStream = new FileWriter("filetujuan.txt"); int c; while ((c = inputStream.read()) != -1) { outputStream.write(c); } } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close();} }}}
Program Copy Isi File (Line) public class CopyLines { public static void main(String[] args) throws IOException { BufferedReader inputStream = null; PrintWriter outputStream = null; try { inputStream = new BufferedReader(new FileReader("filesumber.txt")); outputStream = new PrintWriter(new FileWriter("filetujuan.txt")); String l; while ((l = inputStream.readLine()) != null) { outputStream.println(l); } } finally { if (inputStream != null) { inputStream.close();} if (outputStream != null) { outputStream.close();} }}}
Operasi Berkas (File) dengan Class File
Class File Class File adalah class yang mendukung berbagai operasi yang berhubungan dengan berkas (file) dan direktori(folder) Penggunaannya misalnya untuk mengganti nama atau membuat file atau direktori Konstruktor class File: File(String nama) File(String induk, String anak) File(File induk, String anak)
Method Class File Method Deskripsi abstract void close() abstract void flush() void write(char[] cbuf, int off, int len) void write(String str) void write(String str, int off, int len)
Menampilkan Atribut File public class InfoFile{ public static void main(String[] args){ BufferedReader StreamTeks=new BufferedReader(new InputStreamReader (System.in)); System.out.println("Masukan nama file:"); String namaBerkas = ""; try {namaBerkas = StreamTeks.readLine(); }catch (IOException i){} File berkas = new File(namaBerkas); if (!berkas.exists()){ System.out.println("Berkas ini tak ada");} if (berkas.isDirectory()) System.out.println("Direktori" if (berkas.isFile()) System.out.println("Berkas biasa"); if (berkas.isHidden()) System.out.println("Tersembunyi"); if (berkas.canRead()) System.out.println("Bisa dibaca"); if (berkas.canWrite()) System.out.println("Bisa ditulisi"); if (berkas.isAbsolute()) System.out.println("path absolut"); else System.out.println("path relatif"); System.out.println("Induk : " + berkas.getParent()); System.out.println("Path : " + berkas.getPath()); System.out.println("Path Absolut : " + berkas.getAbsolutePath()); System.out.println("Nama : " + berkas.getName()); System.out.println("Ukuran : " + berkas.length() +" byte");}}
Menghapus File public class HapusFile{ public static void main (String[] args) { String namaFile = "filetujuan.txt"; try { FileOutputStream berkasTem = new FileOutputStream(namaFile); berkasTem.close(); } catch (IOException i) {} File berkas = new File (namaFile); if (berkas.exists()) System.out.println("Berkas " + namaFile + " ada"); else System.out.println("Berkas " + namaFile + " sudah dihapus"); berkas.delete(); System.out.println("Setelah penghapusan...."); }}
Mengganti Nama File public class GantiNamaFile { public static void main(String[] args) { String namaFile = "FileBaru.txt"; try { FileOutputStream berkasTem=new FileOutputStream (namaFile); berkasTem close() }catch (IOException i) {} File berkasSemula= new File(namaFile); File berkasBaru = new File("NamaBaru.txt"); berkasSemula.renameTo(berkasBaru); System.out.println("Nama sudah diganti"); }}
Membuat Direktori public class BuatDir { public static void main(String [] args) { String namaDir = "latihan"; File dir = new File (namaDir); dir.mkdir(); }
Mengakses Data NonSekuensial public class RandomAccessFileBeraksi{ public static void main(String [] args) throws IOException{ RandomAccessFile berkas = new RandomAccessFile("latihan.txt", "rw"); berkas.writeBytes("ABCDEFGHIJKLMNOPQRSTUVW"); char kar = ' ‘; berkas.seek(0); System.out.println("isi berkas: "); while(berkas.getFilePointer() < berkas.length()) { kar = (char) berkas.readByte(); System.out.print(kar);} System.out.println(); berkas.seek(3); berkas.writeByte((int)'z'); System.out.println("Sesudah penggantian"); while (berkas.getFilePointer() < berkas.length()) { kar = (char) berkas.readByte(); System.out.print(kar); }}}
Struktur Data dengan Java Collection Framework romi@romisatriawahono.net Object-Oriented Programming Struktur Data dengan Java Collection Framework http://romisatriawahono.net
Java Collection Framework A collection (sometimes called a container) is an object that groups multiple elements into a single unit Collections are used to store, retrieve, manipulate, and communicate aggregate data Typically, they represent data items that form a natural group, such as a poker hand (a collection of cards), a mail folder (a collection of letters), or a telephone directory (a mapping of names to phone numbers)
Java Collection Framework A collections framework is a unified architecture for representing and manipulating collections All collections frameworks contain the following: Interfaces: These are abstract data types that represent collections. Interfaces allow collections to be manipulated independently of the details of their representation Implementations: These are the concrete implementations of the collection interfaces. In essence, they are reusable data structures Algorithms: These are the methods that perform useful computations, such as searching and sorting, on objects that implement collection interfaces
Core Collection Interfaces Set SortedSet List Queque Map SortedSet
Core Collection Implementation INTERFACES IMPLEMENTATION Hash Table Resizable Array Tree Linked List Hash Table + Linked List Set HashSet TreeSet LinkedHashSet List ArrayList LinkedList Queue Map HashMap TreeMap LinkedHashMap
Object Array Array standard yang dimiliki oleh Java API (java.util) Array memiliki method-method: Method Keterangan static int binarySearch(array, key) Pencarian nilai dalam array boolean equals(array1, array2) Membandingkan apakah dua array memiliki nilai sama. Bekerja pada array satu dimensi static void sort(array) Mengurutkan isi array static String toString(array) Mengubah nilai array menjadi String
Contoh Object Array public class ArrayCari { public static void main(String[] args) { String[] jenisKelamin = new String[3]; jenisKelamin[0] = "laki"; jenisKelamin[1] = "perempuan"; jenisKelamin[2] = "waria"; int ketemu = Arrays.binarySearch(jenisKelamin , "perempuan"); if (ketemu > -1) System.out.println("Data ditemukan pada: “ + ketemu); else System.out.println("Data tidak ditemukan."); }
ArrayList ArrayList mirip dengan array, tapi memiliki kemampuan lebih baik Jumlah elemen dalam ArrayList dapat berubah secara fleksibel tergantung jumlah data yang ada di dalamnya Setelah array terbentuk, data baru dapat dimasukkan di tengah-tengah, tidak harus di akhir elemen array Isi dalam array bisa dihapus, dan index dalam array sesudahnya akan maju satu langkah untuk mengisi slot kosong tersebut
ArrayList Method Keterangan add(object element) Menambahkan object ke dalam ArrayList boolean equals(array1, array2) Menambahkan object ke dalam index yang ditentukan static void sort(array) Menghapus semua elemen dalam ArrayList static String toString(array) Mengambil object pada index tertentu iterator() Mengembalikan iterator pada ArrayList remove(int index) Menghapus object dengan index tertentu remove(object element) Menghapus elemen tertentu size() Mengembalikan nilai berupa jumlah elemen dalam ArrayList toArray() Mengembalikan elemen ArrayList sebagai array object toArray(type[] array) Mengembalikan elemen ArrayList Sebagi array dengan tipe tertentu
Contoh ArrayList public class ArrayAngka{ public static void main(String[] args) { ArrayList angka= new ArrayList(); angka.add("One"); angka.add("Two"); angka.add(3); angka.add("Four"); for (Object i: angka) System.out.println(i); angka.set(1, "Siji"); angka.remove(angka.size() - 1); System.out.println(angka); }
Vector Sama seperti ArrayList, Vector memiliki dua atribut utama: kapasitas dan penambahan kapasitas Penambahan kapasitas menentukan berapa jumlah index yang akan ditambahkan, jika index saat ini sudah tidak mencukupi
Vector Method Keterangan void add(int index, Object element) Memasukkan object ke dalam Vector dengan index yang ditentukan boolean add(Object element) Menambahkan Object ke dalam Vector. Jika berhasil nilai boolean = true void addElement(Object element)
Contoh Vector //menampilkan vector dengan perulangan dan size public class VectorDemo { public static void main(String[] args) { Vector newVector = new Vector(); //menambahkan data vector newVector.add("Jakarta"); newVector.add("Surabaya"); newVector.add("Semarang"); // menampilkan data vector pertama System.out.println("Menampilkan Data Vector:"); System.out.println("Data Vector Pertama:"+ newVector.get(0)); System.out.println("Data Vector Pertama:"+ newVector.firstElement()); System.out.println("Data Vector Kedua: " + newVector.get(1)); // menampilkan data vector terakhir (ketiga) System.out.println("Data Vector Ketiga: " + newVector.elementAt(2)); System.out.println("Data Vector Ketiga: " + newVector.lastElement()); //mencari index vector dan ditampilkan System.out.println('\n' + "Mencari Data Vector:"); int idxCari = newVector.indexOf("Surabaya"); System.out.println("Nilai Index Yang Dicari Adalah: " + idxCari); if (idxCari>=0) System.out.println("Data yang Dicari Adalah:" + newVector.get(idxCari)); //menampilkan vector dengan perulangan dan size for (int i=0; i < newVector.size();i++) System.out.println(i + ":" + newVector.get(i)); //menampilkan vector dengan iterator "for-loop" for (Iterator d = newVector.iterator(); d.hasNext(); ) { System.out.println("->" + d.next()); }
HashMap Koleksi yang memetakan kunci (key) ke dalam nilai (value) Kunci dan nilai dalam HashMap boleh diset dengan null HashMap tepat untuk data yang kompleks, sehingga programmer tidak harus menghafal letak index seperti pada array dan collection class sequence lainnya
HashMap Method Keterangan void clear() Menghapus semua elemen dalam HashMap sehingga ukurannya menjadi 0 boolean isEmpty() Nilai true dikembalikan jika tidak ada elemen di dalam int size() Mengembalikan jumlah elemen dalam HashMap boolean containsKey(Object key) Nilai true dikembalikan jika key ditemukan dalam HashMap boolean containsValue(Object value) Nilai true dikembalikan jika value ditemukan dalam HashMap
Contoh HashMap public class HashMapDemo { public static void main(String[] args) { HashMap map = new HashMap(); //menambahkan data ke hashmap map.put("Nama", "Joko Bodo"); map.put("NIM", new Integer(234567)); map.put("Alamat", "Semarang"); //menampilkan hashmap System.out.println("Hashmap: " + map.entrySet()); System.out.println("Ukuran Hashmap: " + map.size()); map.put("Situs favorit", "ilmukomputer.com"); //menampilkan dan melihat ukuran hashmap //mengecek data di hashmap System.out.println("Has Key NIM?“ + map.containsKey("NIM")); //mendetele data di hashmap System.out.println("Removed: " + map.remove("NIM")); //menampilkan dan melihat ukuran hashmap System.out.println("Hashmap: " + map.entrySet()); System.out.println("Ukuran Hashmap:" + map.size()); }
InterfaceIterator Fasilitas pada Java API yang dapat digunakan untuk melakukan iterasi komponen-komponen dalam Koleksi Ada tiga method yang sering digunakan dalam Iterator: hasNext(), next(), remove() Method Keterangan hasNext() Menentukan apakah masih ada sisa koleksi next() Mengembalikan elemen object pada koleksi. Jika sudah tidak ada elemen lagi namun berusaha diambil maka akan muncul pesan: NoSuchElementException remove() Menghapus elemen yang terakhir kali diakses oleh Iterator
Contoh Iterator while (v.hasNext()){ Object ob = v.next(); System.out.println(v); } for(Iterator i = v.iterator(); i.hasNext();){ String name = (String) i.next(); System.out.println(name);
Generic Implementasi tipe data pada koleksi Tanpa adanya generic, tipe data berbeda-beda dapat dimasukkan dalam sebuah koleksi. Ketika data tersebut diambil, maka perlu dilakukan casting Misal method seperti di bawah: public boolean add (Object o){ //statements } Untuk pengambilan data, harus dilakukan casting tipe data: Mahasiswa mhs = (Mahasiswa) organisasi.get(); Masalah muncul jika ada beberapa elemen yang bukan bertipe Mahasiswa, elemen lain mungkin saja ada karena semua object dapat ditambahkan dengan metode add() diatas
Generic Tipe generic pada koleksi dapat diterapkan dengan menambahkan tanda <> Bila kita berusaha menambahkan elemen dengan tipe data berbeda, maka akan keluar error Dengan adanya generic, program dapat lebih handal, karena kesalahan programmer dapat dicegah
Sorting and Searching Algorithms
Algorithms Sudah menjadi rule-of-thumb dalam dunia programming bahwa berlaku rumus: program = algorithm + data structure
Sorting Algorithms Algoritma sorting adalah algoritma dasar yang paling sering digunakan Data dalam keadaan yang sudah urut (sesuai dengan kunci pengurutan tertentu) akan memudahkan kita dalam manipulasi berikutnya Beberapa algoritma sorting: Bubble Sort Merge Sort Selection Sort
Bubble Sort Pengurutan dengan membandingkan suatu elemen dengan elemen berikutnya Jika elemen sekarang lebih besar daripada elemen berikutnya maka elemen tersebut akan ditukar Data yang ingin diurutkan: 34, 86, 15
Bubble Sort untuk Data 34 86 15 Langkah 3 Langkah 2 Langkah 1 15 34 86 15 34 86 tidak tukar Langkah 3 34 15 86 tukar Langkah 2 34 86 15 Langkah 1
BubbleSort.java BubbleSortBeraksi.java public class BubbleSort { public static void urutkan(int data[]){ for(int langkah=0; langkah<data.length; langkah++){ for(int indeks=0; indeks<data.length-1; indeks++){ if(data[indeks]>data[indeks+1]){ int temp = data[indeks]; data[indeks] = data[indeks+1]; data[indeks+1] = temp; } public class BubbleSortBeraksi{ public static void main(String[] args){ int data[] = {34, 86, 15}; System.out.print("Data awal: "); for(int i=0;i<data.length;i++){ System.out.print(data[i] + " "); } BubbleSort.urutkan(data); System.out.print('\n' + "Data hasil: "); System.out.println();
Selection Sort Pengurutan dengan mencari elemen berikutnya sampai elemen terakhir Jika ditemukan elemen lain yang lebih kecil dari elemen sekarang, maka elemen tersebut akan ditukar Data yang ingin diurutkan: 34, 86, 15
Selection Sort untuk Data 34 86 15 15 86 34 1 2 15 34 86 tukar Langkah 2 34 86 15 1 1 34 86 15 1 2 15 86 34 Langkah 1
SelectionSort.java SelectionSortBeraksi.java public class SelectionSort { public static void urutkan(int data[]){ for(int langkah=0; langkah<data.length-1; langkah++){ int indeksTerkecil=langkah; for(int indeks=langkah+1; indeks<data.length; indeks++){ if(data[indeks]<data[indeksTerkecil]) indeksTerkecil=indeks; } int temp=data[langkah]; data[langkah]=data[indeksTerkecil]; data[indeksTerkecil]=temp; public class SelectionSortBeraksi{ public static void main(String[] args){ int data[] = {34, 86, 15}; System.out.print("Data awal: "); for(int i=0;i<data.length;i++){ System.out.print(data[i] + " "); } SelectionSort.urutkan(data); System.out.print('\n' + "Data hasil: "); System.out.println();
Merge Sort Algoritma pengurutan dengan cara menggabungkan dua kelompok data yang sudah urut, kemudian digabung dan hasilnya adalah data yang terurut Langkah algoritma Merge Sort Bila jumlah item yang diurutkan adalah 0 atau 1, return Urutkan secara rekursif bagian pertama dan kedua secara terpisah Gabungkan dua bagian yang sudah terurut tersebut ke dalam sebuah kelompok terurut
Tugas: (Presentasi + Laporan Akhir) Pahami dan buat program dari algoritma di bawah dengan menggunakan Java (text or gui) Rangkumkan dalam bentuk slide dan presentasikan di pertemuan berikutnya DENGAN BAHASA MANUSIAs yang baik dan benar. PAHAMI DENGAN BAIK apa yang dirangkumkan di slide. Pilih algoritma sesuai digit terakhir NIM: 0 Particle Swarm Optimization 5 A* 1 Neural Network 6 K-Means 2 Support Vector Machine 7 Genetic Algorithm 3 Naive Bayes 8 Ant Collony Optimization 4 C4.5 9 FP-Growth
Tugas Kerjakan semua latihan dan tugas yang ada di slide Java Advanced Kirimkan netbeans project yang sudah di zip ke romi@brainmatics.com dengan subyek: [OOP4-Universitas] Nama–NIM Deadline: 1 minggu Meng-copy file orang lain akan menyebabkan nilai tugas 0
Referensi Sharon Zakhour et al, The Java Tutorial Fourth Edition, http://java.sun.com/docs/books/tutorial Cay Horstmann, Big Java, John Wiley & Sons, 2010 Rogers Cadenhead & Laura Lemay, Teach Yourself Java 6 in 21 Days, Sams Publishing, 2007 Deitel & Deitel, Java for Programmers, Prentice Hall, 2009 Robert Lafore, Data Structures and Algorithms in Java Second Edition, Sams Publishing, 2003 Tim Pengembang JENI, JENI 1-6, Depdiknas, 2007 Rachmad Hakim & Sutarto, Mastering Java, Elex Media Komputindo, 2009