Friday, March 7, 2008

Using Regular Expression in Java

Regular expression (regex) is a very powerful construct to manipulate text. Originated its popularity from PERL language, it is now supported by almost every popular programming language including Java.

So, how do we use it in Java ?

It's easy, just take a look at following tips.

Matching a text pattern within a String object

To match a text pattern, we can use matches() method from String object. Its syntax definition as follow :

boolean java.lang.String.matches(String regex)

So, we see that matches() method take a pattern - which is a String object - and returns boolean value of a matching condition.

Example 1:

if(textToBeMatched.matches("[a-z A-Z]+"))
System.out.println("Text match with a series of alphabet and space character only pattern");


Example 2:

public class RegexTest {

public static void testPhoneNumber(String phoneNumber)
{
String phoneNumberPattern = "^\\+{0,1}[\\d]+[-\\d]+\\d$";

if(phoneNumber.matches(phoneNumberPattern))
System.out.println(phoneNumber + " is a correct phone number !");
else
System.out.println(phoneNumber + " is a wrong phone number !");
}
public static void main(String[] args)
{
testPhoneNumber("+6221-3011-9353"); //outputs a correct phone number
testPhoneNumber("-6221-3011-9353"); //outputs a wrong phone number
}
}


Replacing text that match a pattern

To replace a text matching a pattern we need to use two java.util classes, i.e : Pattern and Matcher.

First, we initialize the pattern with compile() static method of Pattern class. With which also create a Pattern object. We then feed a source text to the matcher() method which then create a Matcher object. The last thing for us to do is to manipulate the text within the object, so we replace text with Matcher's replaceAll() method.



Example:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexReplacementTest {

public static String censoredPhoneNumber(String phoneNumber)
{
String phonePattern = "(\\+{0,1}[\\d]+[-\\d]+\\d).*";

Pattern pattern = Pattern.compile(phonePattern);
Matcher matcher = pattern.matcher(phoneNumber);

return matcher.replaceAll("*censored*");
}

public static void main(String[] args)
{
String phoneNo = "My phone number is +6221-3011-9353";

System.out.println(censoredPhoneNumber(phoneNo));

}
}

Conclusion

This blog's article show how we use regular expression in two ways :
  1. to match a text pattern using String's matches() method.
  2. to replace string which match a text pattern with two helper classes, Pattern and Matcher.

Hope this article can help you to resolve text manipulation problem that you may have encountered.

Any comments to improve this article is greatly welcomed. Post your comment here or mail to feris@phi-integration.com.


Monday, March 3, 2008

Working with Date and Time in Java

I recalled when I started to learn Java, one of the burden I'm facing with is how to deal with date and time properly.

So to help anyone with the same problem, in this article I list down a number of "shortcut tips" on dealing with them.

1. Returning timestamp
Date now = new Date();

long nowLong = now.getTime(); //returning a timestamp
System.out.println("Value is " + nowLong);

2. Formatting date
SimpleDateFormat df = new java.text.SimpleDateFormat("MM/dd/yyyy");
Date now = new Date();
long nowLong = now.getTime(); //returning a timestamp

System.out.println(df.format(now));

3. Assigning date value with a formatted text literal
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

try {
Date date = (Date) sdf.parse("12/31/2007");
System.out.println("Current date is : " + sdf.format(date));
} catch (ParseException e) {
System.out.print("Illegal date !");
}

4. Comparing date with compareTo() method of Date object
//With compareTo() method we should have a return of value -1, 0, and 1.
//Syntax : date1.compareTo(date2);
//Return value
//   -1 : date1 is earlier than date2
//    0 : date1 is having exactly same value with date2
//    1 : date2 is later than date2

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

try {
Date date1 = (Date) sdf.parse("12/31/2007");
Date date2 = (Date) sdf.parse("12/31/2008");
Date date3 = (Date) sdf.parse("12/31/2008");

System.out.println(date1.compareTo(date2));
System.out.println(date2.compareTo(date1));
System.out.println(date2.compareTo(date3));
} catch (ParseException e) {
System.out.print("Illegal date !");
}

5. Assigning date with GregorianCalendar class
//Get current date and time
Calendar cal = new GregorianCalendar();
System.out.println(cal);

//Set date with int value
Calendar newdate = new GregorianCalendar(2008, Calendar.MARCH, 1);
System.out.println(newdate);

//Convert into Date object
Date date = newdate.getTime();     
System.out.println(date);

//Print with a MM/dd/yyyy format
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
System.out.println("New date is : " + sdf.format(date));

Online Resources:
1. http://www.javaworld.com/jw-12-2000/jw-1229-dates.html
2. http://www.javaworld.com/javaworld/jw-03-2001/jw-0330-time.html
3. http://forum.java.sun.com/thread.jspa?threadID=552315&messageID=2701323
4. http://forum.java.sun.com/thread.jspa?threadID=539302&range=1&start=2&forumID=31
5. http://www.exampledepot.com/

Sunday, March 2, 2008

Java 5 : Apa itu Generic ?

Generic diperkenalkan pada Java versi 5. Apa sebenarnya generic itu ? Kenapa sampai diperlukan generic ? Berikut saya akan coba uraikan latar belakang dan cara penggunaan generic ini.

Latar Belakang

Generic dikenal juga sebagai tipe data berparameter (parameterized types), yaitu tipe data yang biasanya didefinisikan di bagian argumen/parameter dan bersifat generik atau dikenali pada saat runtime.

Jika kita memiliki data untype (bertipe Object), maka biasanya kita melakukan casting untuk mengambil nilainya. Kesalahan konversi tipe data ini pada saat runtime sangat mungkin dan sering sekali terjadi. Untuk menghindarinya inilah kita perlu menempatkan tipe data generic ini.

Mari kita buat satu contoh konkret....

ArrayList adalah sebuah class yang sangat berguna dan merupakan bagian dari tipe data Collection. ArrayList bisa menampung data dalam bentuk list dengan Object sebagai nilainya.

Dengan demikian, input atau masukan nilai ke objek bertipe ArrayList ini sangatlah flexible karena seperti yang kita tahu, semua class di Java pasti diturunkan dari class Object.

Pada contoh class BeforeGeneric1 di bawah ini, objek arrList bertipe ArrayList dan dapat menerima 3 input. Kita beri nilai masing-masing 10, new Integer(100), dan "Hello World".

Ketiganya adalah tipe data yang berbeda satu sama lain tetapi valid.



import java.util.ArrayList;
import java.util.List;

public class BeforeGeneric1 {
public static void main(String[] args) {
List arrList = new ArrayList();

arrList.add(10);
arrList.add(new Integer(100));
arrList.add("Hello World !");
}
}



Untuk mengambil kembali nilai yang disimpan oleh arrList ini maka kita harus "hafal" urutan input dengan meta / tipe datanya masing-masing. Kita modifikasi kode di atas sehingga menjadi seperti berikut ini.

Contoh:


import java.util.ArrayList;
import java.util.List;

public class BeforeGeneric1 {
public static void main(String[] args) {
List arrList = new ArrayList();

arrList.add(10);
arrList.add(new Integer(100));
arrList.add("Hello World !");


int a = ((Integer) arrList.get(0)).intValue(); //casting ke int
Integer b = (Integer) arrList.get(1); //casting kembali ke objek bertipe Integer
String c = (String) arrList.get(2); //casting kembali ke objek bertipe String

System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}



Output:

10
100
Hello World !


Perhatikan bahwa untuk setiap akses nilai dari arrList ini, kita perlu melakukan konversi (casting) untuk tiap variabel dengan benar sesuai tipe data asalnya sehingga tidak terjadi error.

Jika kita melakukan kesalahan casting maka pada saat kompilasi akan diberikan pesan error seperti pada contoh di bawah ini.

Contoh:


import java.util.ArrayList;
import java.util.List;

public class BeforeGeneric1 {
public static void main(String[] args) {
List arrList = new ArrayList();

arrList.add(10);
arrList.add(new Integer(100));
arrList.add("Hello World !");


int a = ((Integer) arrList.get(0)).intValue(); //casting ke int
Integer b = (Integer) arrList.get(1); //casting kembali ke objek bertipe Integer
String c = (Integer) arrList.get(2); //casting kembali ke objek bertipe String

System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}



Error Output:

BeforeGeneric1.java:15: incompatible types
found : java.lang.Integer
required: java.lang.String
String c = (Integer) arrList.get(2); //casting kembali ke objek
bertipe String
^
Note: BeforeGeneric1.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

Tidak Ada Kesalahan Pada Saat Kompilasi

Pada prakteknya biasanya ArrayList ini digunakan untuk menyimpan list dengan tipe data yang sama dan diakses dengan melakukan iterasi (perulangan .loop).

Masalah kemudian timbul apabila pada saat kita mengambil nilai dari list tersebut dan terjadi kesalahan casting.

Lihat contoh berikut di bawah ini. Pada saat kompilasi kode ini tidak akan terjadi error karena compiler belum "mengenali" kesalahan tersebut. Error hanya akan terlihat setelah hasil kompilasi tersebut dijalankan atau pada saat runtime.


Contoh:


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class BeforeGeneric2 {
public static void main(String[] args) {
List arrList = new ArrayList();
for (int i = 0; i < 10; i++) {
arrList.add("Hello World");
}

Iterator i = arrList.iterator();

System.out.println("Deretan Angka Genap");
System.out.println("===================");
while (i.hasNext()) {
int a;
a = (Integer) i.next() * 2;
System.out.print("Hasil = " + a + "\n");
}
}
}


Error Output:
Deretan Angka Genap
===================
Exception in thread "main" java.lang.ClassCastException: java.lang.String
at BeforeGeneric2.main(BeforeGeneric2.java:19)


Generic Sebagai Penyelamat

Untuk mengatasi hal tersebut di atas, maka digunakanlah suatu "parameter tipe" pada saat deklarasi objek yang disebut dengan generic.

Syntaxnya kira-kira sebagai berikut :

Class<tipe> objek = new Class<tipe>();

Untuk kasus di atas kita menetapkan bahwa tipe yang akan kita gunakan adalah Integer. Maka code di atas kita ubah menjadi :



import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class AfterGeneric {
public static void main(String[] args) {
List arrList = new ArrayList();
for (int i = 0; i < 10; i++) {
arrList.add(i);
}

Iterator i = arrList.iterator();

System.out.println("Deretan Angka Genap");
System.out.println("===================");
while (i.hasNext()) {
int a;
a = i.next() * 2;
System.out.print("Hasil = " + a + "\n");
}
}
}

Output:
Deretan Angka Genap
===================
Hasil = 0
Hasil = 2
Hasil = 4
Hasil = 6
Hasil = 8
Hasil = 10
Hasil = 12
Hasil = 14
Hasil = 16
Hasil = 18


Dari kode di atas dapat dilihat bahwa kita "menetapkan" bahwa tipe data yang diterima oleh ArrList harus berupa Integer atau int, sedangkan tipe lain akan mengalami error pada saat kompilasi.

Ini kelihatan seperti array, lalu apa kelebihannya Generic ?

Salah satu permasalahan dengan menggunakan array adalah kita harus menetapkan jumlah elemen di array pada saat deklarasi, contohnya :

  Integer[] a = new Integer[5];


Sedangkan pada penggunaan generic, kita cukup mendeklarasikan :

  List<Integer> arrList = new ArrayList<Integer>();


dan kita bisa mengalokasikan jumlah elemen secara dinamis karena ArrayList merupakan collection di dalam Java.


Bacaan Lebih Lanjut

Untuk bacaan lebih lanjut penulis menyarankan buku "Java Generics and Collections" terbitan O'Reilly.

Saturday, March 1, 2008

Tips : Menggunakan String

Objek dari String sering sekali kita gunakan sehari-hari, bahkan mungkin di setiap class dari Java kita terdapat rutin yang menangani String.

Berangkat dari pengalaman pribadi, kita sering sekali suka salah dalam memanipulasi String ini sehingga tidak dapat memaksimalkan penggunaannya.

Mungkin beberapa tips sederhana berikut ini dapat membantu kita menghadapi "kesulitan" tersebut dan membuat kita lebih mengenal dan nyaman bekerja dengan String :)

 

Escape Character

Di dalam String kita dapat memasukkan sekuen dari karakter escape yang terdiri dari satu karakter back slash (\) diikuti oleh karakter escape tersebut.

Beberapa escape character yang sering digunakan adalah :
- \n untuk baris baru
- \t untuk tab
- \\ untuk karakter back slash (\) itu sendiri

Contoh:

Output:

Feris
feris

 

Membandingkan String

Membandingkan String di java tidak bisa menggunakan operator equals (==) tetapi kita harus menggunakan method dari String yaitu equals dan equalsIgnoreCase.

Sesuai dengan nama methodnya, equals digunakan untuk membandingkan objek String secara case-sensitive (huruf kecil dan besar dibedakan) dan sebaliknya equalsIgnoreCase digunakan untuk membandingkan String secara case-insensitive (huruf besar dan kecil tidak dibedakan).

Contoh :

Output :

false
true

 

Menggabungkan String (Concatenation)

Untuk menggabungkan string kita bisa menggunakan beberapa cara yaitu dengan menggunakan method concat maupun dengan operator + (plus) dan += (plus sama dengan).

Contoh :

Output :

Monasmonas
monas
Monasmonas
Monasmonas

 

Konversi Otomatis (Automatic Conversion)

Pada saat kita menggunakan concatenation (penggabungan) antara objek string dengan suatu nilai atau variable yang bertipe primitive (int, char, float, dsbnya) maka secara otomatis data primitif tersebut akan dikonversi menjadi string.

Contoh :

Output :

Angka 1 adalah angka pertama bilangan bulat positif
100 x 2 = 400

 

Mengganti Nilai String Sederhana

Untuk mengganti nilai text dari String cukup menggunakan method replace dari String.

Contoh :

Output :

Feris T.

Memulai Programming Java #2 - Hello World

Setelah kita mengerti cara instalasi java dan dapat memanggil program java dan javac melalui command line (terminal), maka langkah selanjutnya adalah membuat program Java itu sendiri.

Tulisan selanjutnya akan membahas cara kita membuat satu program Java sederhana, kemeudian dijalankan di command line. Dan kita memulainya dengan code yang simpel dan universal, program yang mencetak "Hello World" di layar !

Source Code Java

Seperti kebanyakan source code bahasa pemrograman lain, di Java file source codenya berupa text file yang namanya berakhiran .java.

Contoh nama-nama filenya seperti Testing.java, Contoh.java, HelloWorld.java, dsbnya. Yang penting semuanya berakhiran dengan ektensi .java.

Kita langsung praktek saja dengan satu contoh sederhana :
  1. Buat satu folder dengan nama belajarjava pada drive c Anda (c:\belajarjava).

  2. Buka aplikasi notepad dari menu Start > All Programs > Accessories > Notepad.

  3. Ketik code berikut ini di notepad
    • perhatikan bahwa kita huruf kecil dan huruf besar dibedakan di Java sehingga pengetikan berikut harus memperhatikan hal tersebut atau akan terjadi error.




    public class HelloWorld {
    public static void main(String[] args)
    {
    System.out.print("Hello World !");
    }
    }





  1. Setelah itu save dengan nama HelloWorld.java, perhatikan penulisan nama file harus SAMA huruf besar dan huruf kecilnya sesuai penulisan saya. Hal ini karena nama file berkorelasi langsung dengan nama class di Java.

  2. Selesai

Kompilasi Code

Langkah berikutnya adalah membuat class java (bytecode) yang bisa dieksekusi kemudian. Sebagai overview dari proses kompilasi ini, berikut disertakan gambar dari artikel sebelumnya dengan tambahan informasi program yang terlibat dalam kompilasi dan menjalankan bytecode, yakni javac.exe dan java.exe (untuk platform Windows). Jadi source code HelloWorld.java akan dikompilasi oleh javac.exe untuk menghasilkan bytecode HelloWorld.class. Untuk menjalankan bytecode ini sendiri kita menggunakan java.exe.





Kembali ke contoh kita, langkah-langkah untuk melakukan kompilasi adalah sebagai berikut :
  1. Jalankan "Command Prompt" melalui menu Start => Command Prompt

  2. Masuk ke folder c:\belajarjava dengan perintah "cd c:\belajarjava"

  3. Jalankan perintah "javac HelloWorld.java"

  4. Apabila tidak ada error, maka akan dihasilkan file bytecode bernama HelloWorld.class, untuk melihat apakah file tersebut sudah ada maka lanjutan perintah yang kita jalankan di Command Prompt adalah "dir". Hasilnya mungkin akan tampak sebagai berikut :


  5. Selesai

Menjalankan ByteCode /Class Java

Karena kita hanya memiliki satu bytecode class saja - HelloWorld.class - maka untuk menjalankan bytecode ini sangat sederhana.

Jalankan perintah "java HelloWorld" (bukan "java HelloWorld.class"). Kalau tidak ada error maka harusnya akan tercetak kata "Hello World !" di Command Prompt kita seperti terlihat pada gambar berikut.


Selamat ! Anda sudah berhasil menjalankan program Java pertama Anda !

Pada kesempatan kali ini, penulis secara sengaja tidak membahas secara detil mengenai apa arti code Java kita agar lebih terfokus ke tujuan, yakni bagaimana memulai programming dari instalasi, kompilasi dan menjalankannya.

Langkah selanjutnya tentunya adalah mempelajari bahasa Java secara lebih detil dan konstruktif. Topik-topik seperti konstruksi class di Java, implementasi OOP, API untuk mengolah berbagai hal termasuk filesystem, multimedia, dan sebagainya perlu ditekuni lebih lanjut untuk menjadi programmer Java yang baik.

Semoga artikel ini berguna untuk Anda, penulis akan mencoba membahas hal-hal tersebut di atas di lain kesempatan. Dan saran dan kritik dapat Anda sampaikan melalui komentar yang dapat diposting pada blog ini.


Memulai Programming Java #1- Instalasi di Windows

Pendahuluan

"Bagaimana saya memulai programming Java ?"

Pertanyaan di atas seringkali diajukan pada saat kita ingin belajar programming dengan bahasa Java,
  • Apa yang harus diinstal terlebih dahulu ?
  • Bagaimana saya menulis code dan kompilasi ? Bagaimana saya menjalankan program tersebut ?
  • dan seterusnya...
Oleh karena itu saya tertarik untuk menulis 2 rangkaian artikel dengan topik "Memulai Programming Java" ini, terdiri dari :
1. Instalasi Java
2. Menulis aplikasi sederhana, "Hello World" !

Instalasi Java

Updated : Versi lain untuk artikel instalasi ini tersedia di situs Google Sites, silahkan klik disini.

Sebelum saya memulai dengan langkah-langkah instalasi Java, perlu diluruskan dulu bahwa Java sebenarnya terdiri dari atas 2 pengertian, yaitu :
  1. Teknologi Java sebagai suatu platform yang biasa disebut sebagai Java Runtime Environment (JRE). Platform ini diperlukan sebagai lapisan atau layer untuk menjalankan program Java yang telah dikompilasi (bytecode).

    Untuk melakukan kompilasi kita memerlukan tools tambahan yang ditambahkan ke dalam JRE dan dikenal sebagai Java Development Kit (JDK). Jadi di dalam JDK sendiri secara otomatis sudah terdapat platform JRE.

  2. Bahasa programming Java.

    Bahasa inilah yang mungkin dirujuk sebagai "Java" secara umum. Java merupakan bahasa Object Oriented Programming yang bisa diklaim telah diimplementasikan secara penuh . OOP di Java merupakan pengembangan lebih lanjut dari dari bahasa C++.



JRE dan JDK merupakan suatu aplikasi/program yang perlu diinstalasi terlebih dahulu. Paket untuk JRE dan JDK tersedia untuk berbagai sistem operasi populer seperti Microsoft Windows, Macintosh, Unix, Linux, dan Solaris.

Karena ketersediaan JRE/JDK yang multi-platform dan karena aplikasi Java berjalan di atas JRE ini, maka seringkali teknologi Java dikenal dengan motto "Write Once Run Everywhere" (Ditulis sekali saja untuk satu platform tetapi dapat dijalankan di berbagai platform sistem operasi).

Jadi setelah konsep-konsep Java kita "luruskan" dengan keterangan di atas, sekarang kita melangkah ke instalasi JDK.

Instalasi Java Development Kit (JDK)
  1. Download
    • Masuk ke situs http://java.sun.com/javase/downloads/index.jsp
    • Pilih paket JDK terbaru (pada saat penulisan JDK sudah memasuki versi 6 update 5 seperti terlihat pada gambar di bawah ini). Klik tombol Download.



    • Pilih paket sesuai sistem operasi yang kita gunakan. Untuk contoh, saya pilih Microsoft Windows.
    • Klik "Accept" dan pilih link "Windows Offline Installation, Multi Language"


    • Sering sekali kita masih diminta registrasi account di Sun untuk melanjutkan download. Apabila kita sudah memiliki account Sun kita tinggal login saja, tetapi apabila belum maka lakukan registrasi terlebih dulu.

    • Download paket JDK.

  2. Jalankan program yang telah kita download tersebut.
    • Jalankan setup program jdk-6u5-windows-i586-p.exe atau sesuai yang Anda download.
    • Muncul dialog awal instalasi JDK


    • Tekan Accept untuk menerima persetujuan lisensi dari Sun.



    • Pilih semua fitur yang kita inginkan pada langkah "Custom Setup" dan tekan next untuk melanjutkan. Perhatikan bahwa folder instalasi adalah di C:\Program Files\Java\jdk1.6.0_05



    • Akan keluar progress dialog untuk instalasi JDK. Tunggu hingga selesai.



    • Setelah selesai melakukan instalasi JDK akan dilanjutkan dengan instalasi JRE seperti terlihat pada gambar di bawah. Lanjutkan dengan mengklik tombol Next.



    • Akan keluar progress dialog untuk instalasi JRE.


    • Setelah selesai, klik tombol Finish.



  3. Set environment variable, %PATH%.
    • Klik "Start" pada sistem Windows Anda
    • Klik kanan icon "My Computer", pilih "Properties"



    • Pada dialog "System Properties", klik tab "Advanced" kemudian dilanjutkan dengan klik tombol "Environment Variables"


    • Cari variable "Path" pada bagian System variables dan klik edit.


    • Tambahkan satu nilai pada Variable Value yaitu folder binary instalasi JDK. Untuk contoh pada blog ini maka path kita adalah C:\Program Files\Java\jdk1.6.0_05\bin. Perhatikan pada gambar bahwa antar satu path/folder yang satu dengan path yang lain kita pisahkan dengan tanda titik koma.



    • Klik tombol OK
    • Selesai
  4. Test hasil instalasi kita di Windows.
    • Masuk ke command prompt (Start => Command Prompt atau Start=>Run=>cmd )
    • Ketik "java -version" dan apabila berhasil akan menghasilkan output sebagai berikut :


    • Ketik "javac -version" dan apabila berhasil akan menghasilkan output sebagai berikut:


    • Selesai


Demikian uraian instalasi Java yang disertai dengan screenshot, semoga bisa membantu terutama para "Newbie" di Java untuk memahami hal teknis seputar instalasi Java.