Pada postingan Sorting Bagian 1, kita sudah lihat bagaimana men-sort entry alamat berdasarkan nama. Waktu itu, kita gunakan kelas EntryAlamat yang mengimplementasikan interface Comparable, kemudian meng-override method compareTo(). Kali ini, kita tidak hanya men-sort berdasarkan nama, tetapi juga berdasarkan alamat. Tetapi ada sedikit problem. Kita sudah menggunakan method compareTo() untuk men-sort berdasarkan nama sehingga kita tidak bisa lagi menggunakan method compareTo() untuk men-sort berdasarkan alamat.
So, bagaimana kita melakukannya? Oh gampang. Kita gunakan saja variable boolean pada kelas EntryAlamat, dan kemudian menggunakan pengetesan if-else pada method compareTo(). Selanjutnya, kita berikan return value yang berbeda, tergantung dari variable boolean yang di-set di kelas EntryAlamat.
Ya, ya, ya, itu bisa dilakukan. Tetapi solusi tersebut rasanya kurang elegan dan tidak terlalu OO
Kita akan menggunakan cara lain untuk kasus ini.
Sekarang, darimana kita mulai? Ya, di mana lagi selain lihat java docs. Kita lihat dokumentasi kelas Collections API lagi. Kita menemukan ini.
![]()
Ternyata, terdapat method sort yang kedua. Method ini membutuhkan dua argumen, satu berupa list, dan satu lagi berupa Comparator. What? Again? Yep, kita harus melihat apa itu Comparator. Kita lihat javadocs dan menemukan ini.

Ternyata Comparator juga berupa interface, sama seperti Comparable. Tetapi ada bedanya. Suatu elemen pada list dapat membandingkan dirinya dengan elemen yang lain dengan menggunakan method compareTo() pada interface Comparable. Sedangkan, Comparator merupakan kelas terpisah dan di luar dari tipe-tipe element yang kita bandingkan. Ia semacam custom comparator. Artinya, kita dapat mempunyai comparator sebanyak yang kita mau. Ingin men-sort berdasarkan alamat, gunakan AlamatComparator. Ingin men-sort berdasarkan umur, gunakan UmurComparator. Ingin men-sort berdasarkan nomor Telepon, gunakan NoTeleponComparator. Anyway, you get the idea.
Kemudian, yang perlu kita lakukan adalah memanggil method sort yang kedua tadi dan mem-pass-kan list kita serta Comparator. Comparator akan membantu method Sort mengurutkan elemen-elemen pada list.
Sekarang, bagaimana kita menulis Comparator kita. Ingat, selain berdasarkan nama, kita ingin men-sort berdasarkan alamat. Jadi kita perlu menulis kelas AlamatComparator. How we do it?
Ok, pertama, kita menulis suatu inner class yang mengimplementasikan Comparator, sebut saja inner class-nya AlamatComparator. Di inner class AlamatComparator, kita override method compare(). Di method compare(), kita lakukan sama seperti ketika kita menulis method compareTo(). Hanya diperlukan sedikit modifikasi. Kita akan lihat listing kodenya sebentar lagi. Selanjutnya, kita buat instance dari inner class AlamatComparator, dan kita pass-kan ke method sort yang kedua (Atau istilahnya overloaded method sort(), method sort yang sama tetapi beda argumennya).
Ini dia listing lengkapnya.
import java.util.*;
public class EntryAlamat implements Comparable<EntryAlamat> {
private String nama;
private String alamat;
public EntryAlamat(String nama, String alamat) {
this.nama = nama;
this.alamat = alamat;
}
public String getNama() {
return nama;
}
public String getAlamat() {
return alamat;
}
public int compareTo(EntryAlamat lain) {
return nama.compareTo(lain.getNama());
}
public String toString() {
return "["+ nama + ", " + alamat + "]";
}
}
import java.util.*;
public class SortingEntryAlamat {
public static void main(String[] args) {
new SortingEntryAlamat().test();
}
public void test() {
ArrayList<EntryAlamat> listAlamat = new ArrayList<EntryAlamat>();
// Sampel
listAlamat.add(new EntryAlamat("Yayak", "Gedongkuning"));
listAlamat.add(new EntryAlamat("Paijo", "Babadan"));
listAlamat.add(new EntryAlamat("Andi", "Janti"));
listAlamat.add(new EntryAlamat("Budi", "Tegalrejo"));
System.out.println("Sebelum di-sort:");
System.out.println(listAlamat);
// Sort entry berdasarkan nama
Collections.sort(listAlamat);
System.out.println("\nSetelah di-sort berdasarkan nama:");
System.out.println(listAlamat);
// Sort entry berdasarkan alamat
Collections.sort(listAlamat, new AlamatComparator());
System.out.println("\nSetelah di-sort berdasarkan alamat:");
System.out.println(listAlamat);
}
// inner class yang mengimplementasikan Comparator
class AlamatComparator implements Comparator<EntryAlamat> {
public int compare(EntryAlamat a, EntryAlamat b) {
return a.getAlamat().compareTo(b.getAlamat());
}
}
}
Dan outputnya:

What do you think? Cool? he..he..he..
Oh yeah, one more thing. Untuk keterangan lebih lanjut, baca saja Head First Java.