.::. Hendra Jaya .::.

December 18, 2008

Konversi integer jadi string

Filed under: Java — hjaya @ 9:33 am

Program berikut ini akan mengonversi int menjadi String.

Contohnya :

  • 5 : lima
  • 72 : tujuh puluh dua
  • 341 : tiga ratus empat puluh satu
  • 9999 : sembilan ribu sembilan ratus sembilan puluh sembilan
  • 1000 : seribu
  • 11 : sebelas
  • 6523409 : enam juta lima ratus dua puluh tiga ribu empat ratus sembilan

Saya kira tidak perlu teori yang bermacam-macam, langsung saja kita lihat contoh programnya :

public class Say {
  public static String convert(int angka) throws Exception{
    assert angka >= 0;

    if (angka == 0) return "nol";
    if (angka == 1) return "satu";
    if (angka == 2) return "dua";
    if (angka == 3) return "tiga";
    if (angka == 4) return "empat";
    if (angka == 5) return "lima";
    if (angka == 6) return "enam";
    if (angka == 7) return "tujuh";
    if (angka == 8 ) return "delapan";
    if (angka == 9) return "sembilan";
    if (angka == 10) return "sepuluh";
    if (angka == 11) return "sebelas";

    if (angka < 20) return convert(angka - 10) + " belas";

    if (angka < 100){
      if (angka % 10 > 0) return convert(angka / 10) + " puluh " + convert(angka % 10);
      else return convert(angka / 10) + " puluh";
    }

    if (angka == 100) return "seratus";

    if (angka < 200) return "seratus " + convert(angka - 100);

    if (angka < 1000){
      if (angka % 100 > 0) return convert(angka / 100) + " ratus " + convert(angka % 100);
      else return convert(angka / 100) + " ratus";
    }

    if (angka == 1000) return "seribu";

    if (angka < 2000) return "seribu " + convert(angka - 1000);

    if (angka < 1000000){
      if (angka % 1000 > 0) return convert(angka / 1000) + " ribu " + convert(angka % 1000);
      else return convert(angka / 1000) + " ribu";
    }

    if (angka < 1000000000){
      if (angka % 1000000 > 0) return convert(angka / 1000000) + " juta " + convert(angka % 1000000);
      else return convert(angka / 1000000) + " juta";
    }

    if (angka <= 2147483647){
      if (angka % 1000000000 > 0)
        return convert(angka / 1000000000) + " milyar " + convert(angka % 1000000000);
      else return convert(angka / 1000000000) + " milyar";
    }

    throw new Exception("Not Supported Yet");
  }

  public static void main(String[] args) {
    try {
      System.out.println(Say.convert(2147483647));
    }
    catch (Exception e) {System.out.println(e.getMessage());}
  }
}

December 15, 2008

Insertion Sort

Filed under: Sorting Algorithm — hjaya @ 9:32 am

Pada prinsipnya, Insertion Sort mengambil suatu elemen dari array lalu “menyisipkannya” di tempat yang benar. Proses dilakukan terus menerus sampai seluruh elemen telah berada di tempat yang benar.

Coba perhatikan ilustrasi di bawah ini..

( 5 1 4 2 8 ) -> ( 1 5 4 2 8 ) karena 5 > 1
( 1 5 4 2 8 ) -> ( 1 4 5 2 8 ) karena 5 > 4
( 1 4 5 2 8 ) -> ( 1 4 2 5 8 ) karena 5 > 2, -> ( 1 2 4 5 8 ) karena 4 > 2
( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )

Berikut ini saya sediakan implementasi dari Insertion Sort dalam java :

public class Sort {
  private Sort(){}

  public static <T extends Comparable> T[] insertion(T[] arr, boolean isAscending){
    for (int i = 1; i < arr.length; i++) {
      int j = i;
      T t = arr[i];
      while ((j > 0) && (
          isAscending && (arr[j - 1].compareTo(t) > 0) ||
          !isAscending && (arr[j - 1].compareTo(t) < 0))) {
        arr[j] = arr[j - 1];
        j--;
      }
      arr[j] = t;
    }

    return arr;
  }

  public static T[] insertion(T[] arr, Comparator comparator, boolean isAscending){
    for (int i = 1; i < arr.length; i++) {
      int j = i;
      T t = arr[i];
      while ((j > 0) && (
          isAscending && (comparator.compare(arr[j - 1], t) > 0) ||
          !isAscending && (comparator.compare(arr[j - 1], t) < 0))) {
        arr[j] = arr[j - 1];
        j--;
      }
      arr[j] = t;
    }

    return arr;
  }
}

Untuk eksekusi kode di atas, silahkan lihat post Bubble Sort.

December 14, 2008

Selection Sort

Filed under: Sorting Algorithm — hjaya @ 1:49 pm

Prinsip utama dari Selection Sort adalah mencari nilai terkecil dari suatu array dan menempatkannya sebagai elemen yang paling depan dengan cara menukar elemen tersebut dengan elemen yang paling depan. Setelah ditempatkan di paling depan, algoritma kembali melakukan iterasi, tetapi kali elemen yang paling depan tidak diikutkan karena sudah “terurut” dengan baik. Begitu seterusnya..

Untuk mode descending, nilai yang dicari adalah nilai terbesar.

Untuk lebih jelasnya silahkan perhatikan dua buah ilustrasi di bawah ini (ascending)

  1. Ilustrasi dengan angka (dari Wikipedia)

    ( 5 1 4 2 8 ) -> ( 1 5 4 2 8 ) Nilai min : 1, Target pertukaran : 5
    ( 1 5 4 2 8 ) -> ( 1 2 4 5 8 ) Nilai min : 2, Target pertukaran : 5
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 ) Nilai min : 4, Target pertukaran : 4
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 ) Nilai min : 5, Target pertukaran : 5

  2. Ilustrasi dengan gambar (refresh browser anda jika gambar tidak bergerak)

Berikut ini saya sediakan implementasi Selection Sort dalam Java..

public class Sort {
  private Sort(){}

  public static <T extends Comparable> T[] selection(T[] arr, boolean isAscending){
    for (int i = 0; i < arr.length - 1; i++){
      int min = i;
      for (int j = i + 1; j < arr.length; j++)
        if ((isAscending && (arr[min].compareTo(arr[j]) > 0)) ||
          (!isAscending && (arr[min].compareTo(arr[j]) < 0)))
          min = j;

      T t = arr[i];
      arr[i] = arr[min];
      arr[min] = t;
    }

    return arr;
  }

  public static T[] selection(T[] arr, Comparator comparator, boolean isAscending){
    for (int i = 0; i < arr.length - 1; i++){
      int min = i;
      for (int j = i + 1; j < arr.length; j++)
        if ((isAscending && (comparator.compare(arr[min], arr[j]) > 0)) ||
          (!isAscending && (comparator.compare(arr[min], arr[j]) < 0)))
          min = j;

      T t = arr[i];
      arr[i] = arr[min];
      arr[min] = t;
    }

    return arr;
  }
}

Untuk eksekusi kode di atas, silahkan lihat post Bubble Sort.

Yahoo Emoticon

Filed under: Uncategorized — hjaya @ 1:56 am

Ga ada ide mau nulis apa.. jadinya cuman naruh-naruh yahoo emoticon ajah..

: ) happy   : ( sad  
; ) winking   : D big grin  
; ; ) batting eyelashes   > : D < big hug  
: ” > blushing   : – / confused  
: x love struck   : P tongue  
: – * kiss   = ( ( broken heart  
: – O surprise   X ( angry  
: > smug   B – ) cool  
: – S worried   # : – S whew!  
> : ) devil   : ( ( crying  
: ) ) laughing   : | straight face  
/ : ) raised eyebrows   = ) ) rolling on the floor laugh  
O : – ) angel   : – B nerd  
= ; talk to the hand   I – ) sleepy  
8 – | rolling eyes   L – ) loser  
: – & sick   : – $ don’t tell anyone  
[ - ( no talking   : O ) clown  
8 - } silly   < : - P party  
( : | yawn   = P ~ drooling  
: - ? thinking   # - o d'oh  
= D > applause   : - S S nail biting  
@ - ) hypnotized   : ^ o liar  
: - w waiting   : - < sigh  
> : P phbbbbt   < ) : ) cowboy  
: @ ) pig   3 : - O cow  
: ( | ) monkey   ~ : > chicken  
@ } ; - rose   % % - good luck  
* * = = flag   ( ~ ~ ) pumpkin  
~ O ) coffee   * - : ) idea  
8 - X skull   = : ) bug  
> - ) alien   : - L frustrated  
[ - O < praying   $ - ) money eyes  
: - " whistling   b - ( feeling beat up  
: ) > - peace sign   [ - X shame on you  
\ : D / dancing   > : / bring it on  
; ) ) hee hee   o - > hiro  
o = > billy   o - + april  
( % ) yin yang   : - @ chatterbox  
^ : ) ^ not worthy   : - j oh go on  
( * ) star   : ) ] on the phone  
: – c call me   ~ X ( at wits’ end  
: – h wave   : – t time out  
8 – > day dreaming   : – ? ? i don’t know  
% – ( not listening   : o 3 puppy dog eyes  
X _ X i don’t wanna see   : ! ! hurry up!  
\ m / rock on!   : – q thumbs down  
: – b d thumbs up   ^ # ( ^ it wasn’t me  
: b z bee   : a r ! pirate  
[ . . ] transformer  

Tidak semua emoticon yang ada di atas dapat anda pakai. Ada beberapa emoticon yang hanya bisa digunakan di Yahoo Messenger versi web

December 12, 2008

Protected: Tutorial Menginstall Xampp dan Joomla di Windows

Filed under: Uncategorized — hjaya @ 3:04 pm

This post is password protected. To view it please enter your password below:


Bubble Sort

Filed under: Sorting Algorithm — hjaya @ 4:41 am

Bubble Sort adalah algoritma Sorting yang paling populer, paling gampang diimplementasikan dan juga paling rakus memakan resource.

Algoritma ini mengiterasi seluruh elemen array dari awal sampai akhir dan membandingkan setiap dua buah elemen array yang bertetanggaan.
Jika didapati kedua elemen yang bertetanggaan itu berbeda (salah satu elemen lebih besar/kecil dari elemen lain), maka kedua elemen itu akan “ditempatkan” pada urutan yang benar.
Jika metode pengurutan yang diinginkan adalah ascending (dari kecil ke besar), maka elemen yang lebih besar akan ditempatkan setelah elemen yang lebih kecil.
Begitu juga sebaliknya, jika metode pengurutan yang diinginkan adalah descending (dari besar ke kecil), maka elemen yang lebih besar akan ditempatkan sebelum elemen yang lebih kecil.

Untuk lebih jelasnya silahkan perhatikan dua buah ilustrasi di bawah ini (ascending)

  1. Ilustrasi dengan angka (dari Wikipedia)

    Iterasi pertama:
    ( 5 1 4 2 8 ) -> ( 1 5 4 2 8 ) Algoritma ini membandingkan dua elemen pertama dan menukarnya
    ( 1 5 4 2 8 ) -> ( 1 4 5 2 8 ) swap
    ( 1 4 5 2 8 ) -> ( 1 4 2 5 8 ) swap
    ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 )

    Iterasi kedua:
    ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 )
    ( 1 4 2 5 8 ) -> ( 1 2 4 5 8 ) swap
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )

    Sebenarnya, array ini sudah terurut dengan baik, tetapi algoritma kita belum tau. Algoritma kita hanya tahu bahwa dia harus mengiterasi lagi dan baru berhenti jika tidak terjadi swap sama sekali.

    Iterasi ketiga:
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
    ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )

    Akhirnya, algoritma kita sadar bahwa tidak ada swap lagi dan algoritma pun berhenti mengiterasi.

  2. Ilustrasi dengan gambar (refresh browser anda jika gambar tidak bergerak)

    bubble-sort

Berikut ini saya sediakan implementasi Bubble Sort dalam Java..

public class Sort {
  private Sort(){}

  public static <T extends Comparable<T>> T[] bubble(T[] arr){
    boolean swapped;

    for (int i = 0; i < arr.length; i++){
      swapped = false;

      for (int j = arr.length - 1; j >= i + 1; j--){
        if (arr[j - 1].compareTo(arr[j]) > 0){
          T t = arr[j - 1];
          arr[j - 1] = arr[j];
          arr[j] = t;

          swapped = true;
        }
      }

      if (!swapped) break;
    }

    return arr;
  }
}

Sayangnya, method bubble di atas hanya bisa mengurutkan ascending dan ini kurang baik. Untuk mengembangkan method bubble di atas agar bisa mengurutkan secara ascending dan descending, kita tambahkan beberapa perubahan seperti ini :

public class Sort {
  private Sort(){}

  public static <T extends Comparable<T>> T[] bubble(T[] arr, boolean isAscending){
    boolean swapped;

    for (int i = 0; i < arr.length; i++){
      swapped = false;

      for (int j = arr.length - 1; j >= i + 1; j--){
        if ((isAscending && (arr[j - 1].compareTo(arr[j]) > 0)) ||
          (!isAscending && (arr[j - 1].compareTo(arr[j]) < 0)))
        {
          T t = arr[j - 1];
          arr[j - 1] = arr[j];
          arr[j] = t;

          swapped = true;
        }
      }

      if (!swapped) break;
    }

    return arr;
  }

  public static <T> T[] bubble(T[] arr, Comparator<T> comparator, boolean isAscending){
    boolean swapped;

    for (int i = 0; i < arr.length; i++){
      swapped = false;

      for (int j = arr.length - 1; j >= i + 1; j--){
        if ((isAscending && (comparator.compare(arr[j - 1], arr[j]) > 0)) ||
          (!isAscending && (comparator.compare(arr[j - 1], arr[j]) < 0)))
        {
          T t = arr[j - 1];
          arr[j - 1] = arr[j];
          arr[j] = t;

          swapped = true;
        }
      }

      if (!swapped) break;
    }

    return arr;
  }
}

Penjelasan kode program di atas masih agak rumit, mengingat blog ini belum membahas tentang Generic. Sebagai gambaran saja, method bubble pada kode program di atas
akan meminta input berupa array of T. Dimana T adalah suatu kelas yang mengimplement interface Comparable. Mengapa Comparable? Karena
interface inilah yang mampu menjanjikan bahwa suatu object yang mengimplement dirinya akan dapat dibandingkan dengan object lain.

public class Student {
  private String name;
  private int point;

  public Student (String name, int point){
    this.name = name;
    this.point = point;
  }

  public String getName() {return name;}
  public int getPoint() {return point;}

  @Override
  public String toString(){
    return name + ":" + point;
  }

  public static void main(String[] args) {
    Integer[] integers = new Integer[]{1, -10, 3, 0, 6, 7, 4, 2, 1, 15, 5, -6};
    String[] strings = new String[]{"pisang", "apel", "nangka",
                    "jambu", "rambutan", "melon", "nanas"};
    Student[] students = new Student[]{
        new Student("basana", 64), new Student("tika", 68), new Student("ingel", 98),
        new Student("bule", 45), new Student("septa", 78), new Student("hartoyo", 85),
        new Student("jaya", 97), new Student("lukas", 25), new Student("lia", 77),
        new Student("akub", 68)
        };

    for (Integer i : Sort.bubble(integers, true))System.out.print(i + " ");
    System.out.println();
    // Mengeluarkan output -10 -6 0 1 1 2 3 4 5 6 7 15

    for (String s : Sort.bubble(strings, false))System.out.print(s + " ");
    System.out.println();
    // Mengeluarkan output rambutan pisang nangka nanas melon jambu apel
  }

    for (Student st : Sort.bubble(students, new StudentComparator(), true))
      System.out.print(st + " ");
    System.out.println();
    // Mengeluarkan output lukas:25 bule:45 basana:64 akub:68 tika:68 lia:77
    // septa:78 hartoyo:85 jaya:97 ingel:98
}

Ini kelas comparatornya :

public class StudentComparator implements Comparator<Student> {
  @Override
  public int compare(Student s1, Student s2) {
    int i = s1.getPoint() - s2.getPoint();

    if (i == 0) return s1.getName().compareTo(s2.getName());
    return i;
  }
}

Sekedar tambahan, ada pengembangan dari Bubble Sort dimana algoritma tidak hanya mengiterasi array dari elemen paling awal, tetapi juga dari elemen paling akhir. Pengembangan ini dikenal dengan nama “Bidirectional Bubble Sort” dan inilah implementasinya di Java

public class Sort {
  private Sort(){}

  public static <T extends Comparable> T[] bidirectionalBubble(T[] arr, boolean isAscending){
    int top = arr.length;
    int bot = -1;
    boolean swapped;

    while (bot < top) {
      swapped = false;
      bot++;
      top--;

      for (int i = bot; i < top; i++) {
        if ((isAscending && (arr[i].compareTo(arr[i + 1]) > 0)) ||
          (!isAscending && (arr[i].compareTo(arr[i + 1]) < 0)))
        {
          T t = arr[i];
          arr[i] = arr[i + 1];
          arr[i + 1] = t;

          swapped = true;
        }
      }
      if (!swapped) break;

      for (int j = top; --j >= bot;) {
        if ((isAscending && (arr[j].compareTo(arr[j + 1]) > 0)) ||
          (!isAscending && (arr[j].compareTo(arr[j + 1]) < 0)))
        {
          T t = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = t;

          swapped = true;
        }
      }
      if (!swapped) break;
    }

    return arr;
  }

  public static T[] bidirectionalBubble(T[] arr, Comparator comparator, boolean isAscending){
    int top = arr.length;
    int bot = -1;
    boolean swapped;

    while (bot < top) {
      swapped = false;
      bot++;
      top--;

      for (int i = bot; i < top; i++) {
        if ((isAscending && (comparator.compare(arr[i], arr[i + 1]) > 0)) ||
          (!isAscending && (comparator.compare(arr[i], arr[i + 1]) < 0)))
        {
          T t = arr[i];
          arr[i] = arr[i + 1];
          arr[i + 1] = t;

          swapped = true;
        }
      }
      if (!swapped) break;

      for (int j = top; --j >= bot;) {
        if ((isAscending && (comparator.compare(arr[j], arr[j + 1]) > 0)) ||
          (!isAscending && (comparator.compare(arr[j], arr[j + 1]) < 0)))
        {
          T t = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = t;

          swapped = true;
        }
      }
      if (!swapped) break;
    }

    return arr;
  }
}

December 11, 2008

Access Modifier di Java

Filed under: Java — hjaya @ 1:56 pm

Di Java, dikenal empat buah Access Modifier, yaitu private, protected, public dan default. Ada baiknya jika kita mempelajari lagi keempat access modifier ini

  1. Access modifier private adalah access modifier yang paling tertutup. Field maupun method yang dinyatakan private tidak akan bisa diakses (visible) oleh kelas manapun dimanapun, kecuali kelas itu sendiri.
  2. Access modifier default adalah access modifier yang akan anda peroleh jika anda tidak memberikan access modifier apapun di suatu field ataupun method. Acces modifier default sifatnya visible terhadap kelas-kelas yang terdapat dalam package yang sama. Sekedar catatan, keyword default di Java dipakai dalam conditional switch, artinya anda tidak bisa secara eksplisit mengetikkan kata default sebagai access modifier di suatu field ataupun method. Dengan membiarkan access modifier-nya kosong, maka suatu field ataupun method akan diberi access modifier default.
  3. Access modifier protected mirip dengan default, hanya saja protected harus ditulis secara eksplisit dalam kode program. Selain itu, protected juga memiliki sifat tambahan, yaitu field dan method yang diberi access modifier ini akan diturunkan ke subclass.
  4. Access modifier public – gampangnya – berarti world-accessable. Artinya, kelas manapun dimanapun dapat mengakses field atau method yang ditandai public.

Sebagai tambahan untuk pembaca. Sebuah kelas akan terlihat “telanjang bulat” di hadapan inner class-nya. Artinya, field-field ataupun method-method yang ditandai private pun tetap dapat diakses oleh inner class. Begitu juga sebaliknya.

Contoh 1 :
  package buah;
  private class Pepaya {}

Kode program di atas akan menghasilkan compile error, karena deklarasi kelas tidak boleh menggunakan access modifier private. (Sebenarnya, ada kasus-kasus dimana boleh, tapi itu tidak dibahas di post ini)

Contoh 2 :
  package buah;
  class Pepaya {
    String nama = "Pepaya mentah";
  }
Kode program di atas akan menghasilkan kelas Pepaya dengan access modifier default dan juga atribut ‘nama’ dengan access modifier default.
Untuk mengaksesnya, kita buat kelas Mangga (dengan access modifier default) yang berada di package yang sama
  package buah;
  class
Mangga {
    public static void main(String... args){
      Pepaya p = new Pepaya();
      System.out.println(p.nama);
    }
  }
Sesuai harapan.. anda akan menerima output berupa tulisan ‘Pepaya Mentah’. Sebagai catatan, kelas Mangga tidak harus menggunakan access modifier default , access modifier protected maupun public pun bisa dipakai.

Contoh 3 :
  package buah;
  protected class Jambu {
    protected String nama = "Jambu ga jelas";
  }

Untuk mengakses kelas Jambu yang protected beserta atribut ‘nama’-nya yang  protected. Kita harus meng-inherit kelas Jambu tersebut. Perlu diperhatikan bahwa post ini tidak membahas soal inheritance, tetapi pada access modifier. Oleh karena itu detail tentang inheritance tidak akan dibahas.
  package sayur;
  import buah.Jambu;
  public class JambuKlutuk extends Jambu {
    public String nama = "Jambu klutuk";
  }

  package buah;
  public class Mangga{
    public static void main(String... args){
      Jambu j = new Jambu();
      System.out.println(j.nama);
    }
  }

Ada beberapa hal yang harus diperhatikan :

  1. Access modifier protected tidak harus di-akses via inheritance. Kelas-kelas yang berada dalam package yang sama juga dapat mengakses kelas/atribut/method yang protected
  2. (Sedikit menyimpang) Dalam inheritance, access modifier tidak boleh semakin tertutup. Kelas JambuKlutuk yang meng-inherit kelas Jambu harus menggunakan access modifier yang lebih terbuka dari protected, misalnya public.

Untuk akses modifier public, tampaknya tidak perlu dibahas lagi. Access modifier ini sangat lazim dipakai dan tidak perlu dibahas lagi.

Sebagai penutup, ini table access modifier yang mungkin bisa dijadikan panduan :
Access Modifier Table

December 10, 2008

Membuat Oracle JDeveloper Berlari Seperti Anjing

Filed under: Java — hjaya @ 9:49 am

Secara default, JDeveloper keluaran Oracle akan berlari seperti siput. Saya tidak tahu bagaimana caranya membuat JDeveloper berlari seperti cheetah ataupun kuda. Tapi saya tahu bagaimana cara membuat JDeveloper berlari seperti anjing :P

Oke.. sebelumnya, kita samakan dulu environment yang dipakai. Dalam post ini, saya menggunakan Ubuntu Linux dengan user bernama wks309. Artinya, home directory saya adalah /home/wks309 dan JDeveloper saya install di /home/wks309/master/jdev. Oh iya, memori fisik yang dimiliki oleh workstation saya adalah 2 GB, silahkan sesuaikan setting anda :D

Nah inilah langkah-langkah yang dapat anda coba untuk membuat JDeveloper anda berlari seperti anjing :P

  1. Edit konfigurasi JDeveloper

    JDeveloper mempunyai file konfigurasi yang akan dibaca pada saat dijalankan, file tersebut terletak di /home/wks309/master/jdev/jdev/bin/jdev.conf. Sebelum membuka file tersebut, buatlah backup file tersebut dan beri nama jdev.conf.bak.

    Sekarang, kita edit beberapa entry pada file tersebut…

    dari AddVMOption      -Xmx512M
    menjadi AddVMOption      -Xmx1024M
    Anda tidak perlu mengalokasikan memori dalam jumlah yang terlalu besar, karena perubahan yang dihasilkan oleh entry ini tidak signifikan

    dari # AddVMOption      -DVFS_ENABLE=true
    menjadi AddVMOption      -DVFS_ENABLE=true

    dari # AddVMOption -Dsun.java2d.noddraw=true
    menjadi AddVMOption -Dsun.java2d.noddraw=true

  2. Minimalkan entry yang ada di faces_config.xml

    Salah satu trik yang bisa dipakai untuk membuat JDeveloper berlari lebih cepat adalah dengan meminimalkan entri-entri pada faces_config.xml.
    Pada project yang besar, entri pada faces_config bisa sampai beribu-ribu baris dan JDeveloper akan berlari seperti siput. Untuk mengakali hal ini, hapus/komen semua entri-entri di faces_config.xml yang tidak anda perlukan dan dijamin JDeveloper akan berlari lebih kencang, seperti seekor anjing. Guk!! Guk!! :P

    Sebagai tambahan, dalam project yang besar biasanya faces config yang dimiliki tidak hanya satu buah. Anda juga perlu menghapus/meng-komen entri-entri di file faces config lain untuk mempercepat lari JDeveloper anda

  3. Disable ekstensi-ekstensi yang tidak diperlukan

    Jika anda masuk ke Help -> About -> Extensions anda akan melihat fitur-fitur apa saja yang disediakan oleh JDeveloper.

    Sekarang, anda dapat mempercepat laju JDeveloper anda dengan men-disable ekstensi-ekstensi yang tidak diperlukan
    Caranya :

    1. Daftarkan ekstensi yang tidak anda perlukan

      Buat satu file kosong, sebut saja “disabled-extension.txt” dan letakkan di /home/wks309. Lalu isi file tersebut dengan ekstensi-ekstensi yang tidak anda perlukan, misalnya :
      oracle.bibeans
      oracle.jdeveloper.cvs
      oracle.vcr.10.1.3
      oracle.wireless.dt
      oracle.portlets
      oracle.jviews-registration
      oracle.struts
      oracle.bpm.workflow
      oracle.extapp

    2. Jalankan JDeveloper dengan opsi tambahan -J-Dide.noextensions

      Untuk men-disable ekstensi-ekstensi yang anda daftarkan itu, jalankan JDeveloper dengan opsi tambahan -J-Dide.noextensions=@/home/wks309/disabled-extension.txt. Dalam environment saya, perintah lengkapnya menjadi /home/wks309/master/jdev/jdev/bin/jdev -J-Dide.noextensions=@/home/wks309/disabled-extension.txt

      Sekarang anda dapat cek kembali ekstensi-ekstensi yang di-load oleh JDeveloper dan hasilnya akan tampak seperti ini :

Dengan mengikuti cara-cara yang disebutkan di atas, seharusnya JDeveloper anda dapat berlari lebih cepat. Walaupun tidak secepat cheetah atau kuda, secepat anjing pun bolehlah :D

Faktor Persekutuan Terbesar (FPB) & Kelipatan Persekutuan Terkecil (KPK)

Filed under: Java — hjaya @ 4:07 am

Jika kita mempunyai dua buah bilangan bukan 0, sebut saja a dan b, maka FPB didefinisikan sebagai bilangan bulat terbesar yang habis membagi kedua bilangan tersebut (a dan b).

Menurut pengamatan saya, anak-anak SD jauh lebih tangkas dalam menghitung FPB ketimbang orang dewasa :D , karena anak-anak SD mempelajari FPB untuk menghadapi ulangan di sekolah sementara orang dewasa tidak lagi memperhatikan hal-hal menarik dalam bilangan.

Alih-alih memberikan penjelasan tentang FPB, post ini akan memberikan contoh FPB karena pembaca pasti sudah pernah mendengar tentang FPB, hanya perlu diingatkan kembali…

  1. FPB(30, 24)
    Faktor dari 30 : 2 x 3 x 5
    Faktor dari 24 : 2 x 2 x 2 x 3
    FPB dari 30 dan 24 = 2 x 3 = 6
  2. FPB(12, 140)
    Faktor dari 12 : 2 x 2 x 3
    Faktor dari 140 : 2 x 2 x 5 x 7
    FPB dari 12 dan 140 = 2 x 2 = 4
  3. FPB(52, 260)
    Faktor dari 52 : 2 x 2 x 13
    Faktor dari 260 : 2 x 2 x 5 x 13
    FPB dari 52 dan 260 = 2 x 2 x 13 = 52

Bagaimana? Sudah ingat tentang FPB? Jika anda sudah ingat tentang FPB, mari kita lanjutkan pembahasan menuju Bézout’s identity.

Dalam teori bilangan, ada sebuah lemma yang mengatakan “Jika a dan b adalah dua buah bilangan bulat bukan 0 dengan FPB d, maka pastilah ada bilangan bulat x dan y yang memenuhi persamaan ax + by = d” Lemma inilah yang dikenal sebagai Bézout’s lemma dan x dan y disebut Bézout’s identity

Sesuai dengan contoh FPB di atas, maka

  1. FPB(30, 24)
    x = 1, y = -1
    .:. 30 . 1 + 24 . (-1) = FPB(30, 24) = 6
  2. FPB(12, 140)
    x = 12, y = -1
    .:. 12 . 12 + 140 . (-1) = FPB(12, 140) = 4
  3. FPB(52, 260)
    x = 1, y = 0
    .:. 52 . 1 + 260 . 0 = FPB(52, 260) = 52

Mengenai pembuktian tentang Bézout’s identity, saya serahkan sepenuhnya kepada matematikawan-matematikawan :D

Selain Bézout’s identity, di dalam FPB juga dikenal satu istilah lagi, koprima (coprime). Koprima atau biasa juga disebut relatif prima terjadi jika FPB dari a dan b adalah 1. Artinya, a dan b tidak memiliki satu pun faktor persekutuan, kecuali 1. Mirip dengan definisi bilangan prima bukan? Coba baca post tentang bilangan prima ini untuk memperjelas.

Berikut ini adalah potongan program dalam Java untuk mencari Bézout’s identity, menghitung FPB dan tentu saja menentukan apakah suatu pasangan bilangan adalah koprima atau bukan. Potongan program ini menggunakan kelas Pair, mungkin ada baiknya anda lompati dulu pembacaan source code dari kelas Pair :P karena kita belum membahas tentang Generic

public class Pair<L extends Comparable<L>, R extends Comparable<R>>
  implements java.io.Serializable, Comparable<Pair<L, R>>
{
  private static final long serialVersionUID = -3392433628448662871L;
  private L left;
  private R right;

  public Pair(){}
  public Pair(L left, R right){
    this.left = left;
    this.right = right;
  }

  public L getLeft() {return left;}
  public void setLeft(L left) {this.left = left;}
  public R getRight() {return right;}
  public void setRight(R right) {this.right = right;}

  @Override
  public int compareTo(Pair<L, R> p) {
    return left.compareTo(p.left) != 0 ? left.compareTo(p.left) : right.compareTo(p.right);
  }
}

public class Math{
  private Math(){}

  public static Pair<Integer, Integer> getBezoutIdentity(int a, int b){
    if ((a % b) == 0) return new Pair<Integer, Integer>(0, 1);
    else {
      Pair<Integer, Integer> bi = getBezoutIdentity(b, a % b);
      return new Pair<Integer, Integer>(bi.getRight(), bi.getLeft() - bi.getRight() * (a / b));
    }
  }

  public static int gcd(int a, int b){
    Pair<Integer, Integer> bezoutIdentity = getBezoutIdentity(a, b);
    return a * bezoutIdentity.getLeft() + b * bezoutIdentity.getRight();
  }

  public static boolean isCoprime(int a, int b){return gcd(a, b) == 1;}
}

Jika berbicara FPB, biasanya kita juga membicarakan KPK. Intinya, KPK, dalam definisi non-formal adalah bilangan positif terkecil yang merupakan kelipatan dari a dan b (masih dalam konteks FPB). Sekarang, kita gunakan contoh-contoh di atas untuk menyegarkan kembali ingatan kita tentang KPK.

  1. KPK(30, 24)
    Kelipatan dari 30 : 30, 60, 90, 120, dst…
    Kelipatan dari 24 : 24, 48, 72, 96, 120, dst..
    KPK dari 30 dan 24 = 120
  2. KPK(12, 140)
    Kelipatan dari 12 : 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, .. 396, 408, 420, dst…
    Kelipatan dari 140 : 140, 280, 420, dst…
    KPK dari 12 dan 140 = 140
  3. KPK(52, 260)
    Kelipatan dari 52 : 52, 104, 156, 208, 260, dst…
    Kelipatan dari 260 : 260, 520, 780, dst…
    KPK dari 52 dan 260 = 260

Secara matematis, KPK dinyatakan sebagai hasil bagi antara perkalian a dan b dengan FPB-nya.
kpk

Alhasil, mudahlah bagi kita untuk membuat method untuk menghitung KPK.

public class Math{
  /*
  * method-method sebelumnya ....
  */

  public static int lcm(int a, int b){return a * b / gcd(a, b);}
}

Variabel Swap

Filed under: Java — hjaya @ 1:20 am

Dalam pemrograman komputer, dikenal istilah Swap, yaitu suatu tindakan menukar nilai antar dua buah variabel.
Sebagai ilustrasi, misalkan anda mempunyai variabel x dengan nilai 10 dan y dengan nilai 15. Setelah di-swap, maka nilai x akan menjadi 15 dan y menjadi 10.

Ada banyak cara untuk melakukan swap, yang paling mudah adalah dengan menggunakan suatu variabel temporer (dummy variable). Seperti ini :

public class Main{
  public static void main (String[] args){
    Object a = "first";
    Object b = 2;

    Object c = a; // c adalah variabel temporer
    a = b;
    b = c;

    System.out.println(a + " " + b);
    // Mengeluarkan output 2 first
  }
}

Cara ini memang sangat mudah tapi juga sangat naif, karena menggunakan sebuah variabel temporer yang kesannya males mikir :D

Dalam dunia algoritma, dikenal dua buah metode swap lagi yang tidak membutuhkan variabel temporer seperti pada kode program di atas. Sayangnya, kedua algoritma ini hanya berlaku untuk beberapa tipe data primitif saja.

Berikut ini adalah algoritma swap yang hanya menggunakan operasi tambah dan kurang. Algoritma ini tidak memerlukan variabel temporer. Sayangnya, algoritma ini hanya dapat diaplikasikan pada tipe data integer (int dan Integer) saja.

public class Main{
  public static void main(String[] args){
    int a = 24;
    int b = 7;

    a = a + b;
    b = a - b;
    a = a - b;

    System.out.println(a + " " + b);
    // Mengeluarkan output 7 24
  }
}

Algoritma swap yang kedua jelas lebih cerdas dan lebih cepat dibanding algoritma yang pertama kali disuguhkan. Lebih cerdas karena tidak menggunakan variabel temporer :P dan lebih cepat karena hanya melakukan operasi penjumlahan.

Algoritma swap terakhir yang akan dibahas dalam post ini adalah algoritma yang menggunakan operator XOR (Exclusive OR). Algoritma ini berlaku untuk tipe data integer (int dan Integer), char (char dan Character), dan boolean (boolean dan Boolean).

Sekedar menyegarkan ingatan kembali, berikut saya lampirkan tabel kebenaran untuk AND, OR dan XOR
  

p q p & q p | q p ^ q
T T T T F
T F F T T
F T F T T
F F F F F

Dengan memanfaatkan operasi XOR, kita dapat menghasilkan sebuah algoritma swap yang lebih manis, sebagai berikut :

public class Main{
  public static void main(String[] args){
    // XOR Swap dengan memakai Integer sebagai contoh
    // Berlaku juga untuk Boolean, Character serta primitif int, boolean, dan char

    Integer a = 24;
    Integer b = 7;

    a ^= b;
    b ^= a;
    a ^= b;

    System.out.println(a + " " + b);
    // Mengeluarkan output 7 24
  }
}

Lantas bagaimana jika kita menginginkan suatu method yang meminta dua buah object sebagai parameter dan menukar nilai keduanya? Mengingat sifat Java yang copy by reference, kita tidak dapat mengganti state dari sebuah object yang dilempar sebagai parameter. Untuk mengganti state dari object tersebut, haruslah disediakan setternya. Sayangnya, di Java ada beberapa object yang sifatnya immutable, artinya object-object ini tidak dapat diganti lagi statenya setelah diinisiasi. Integer, String, Character dan Boolean tergolong dalam object-object yang immutable. Oleh karena itu, sampai saat ini saya masih beranggapan mustahil mengubah state object-object immutable dalam sebuah method dimana object-object tersebut dikirim sebagai parameter.

Supaya tidak menjadi bingung, perihal copy by reference dan immutable akan dibahas di post lain. Saat ini anggap saja bahwa “object yang dikirim sebagai parameter haruslah menyediakan setter jika ingin diubah nilainya”. Dengan demikian dirancanglah kelas-kelas berikut ini :

public class Dummy {
  private Character initial;
  private Integer age;
  private Boolean active;

  public Dummy(Character initial, Integer age, Boolean active){
    this.active = active;
    this.initial = initial;
    this.age = age;
  }

  public Boolean getActive() {return active;}
  public void setActive(Boolean active) {this.active = active;}
  public Character getInitial() {return initial;}
  public void setInitial(Character initial) {this.initial = initial;}
  public Integer getAge() {return age;}
  public void setAge(Integer age) {this.age = age;}

  public String toString(){return initial + " " + age + " " + active;}
}

public class DummySwapper {
  private DummySwapper(){}
  public static void swap (Dummy d1, Dummy d2){
    // INITIAL - Character
    d1.setInitial((char) (d1.getInitial() ^ d2.getInitial()));
    d2.setInitial((char) (d2.getInitial() ^ d1.getInitial()));
    d1.setInitial((char) (d1.getInitial() ^ d2.getInitial()));

    // AGE - Integer
    d1.setAge(d1.getAge() ^ d2.getAge());
    d2.setAge(d2.getAge() ^ d1.getAge());
    d1.setAge(d1.getAge() ^ d2.getAge());

    // ACTIVE - Boolean
    d1.setActive(d1.getActive() ^ d2.getActive());
    d2.setActive(d2.getActive() ^ d1.getActive());
    d1.setActive(d1.getActive() ^ d2.getActive());
  }
}

public class Main {
  public static void main(String... args) {
    Dummy d1 = new Dummy('A', 11, true);
    Dummy d2 = new Dummy('Z', 99, false);

    DummySwapper.swap(d1, d2);

    System.out.println(d1);
    // Mengeluarkan output Z 99 false

    System.out.println(d2);
    // Mengeluarkan output A 11 true
  }
}

Older Posts »

Blog at WordPress.com.