Selasa, 27 Desember 2011

SORTING

Sorting adalah sebuah cara untuk membuat collection terurut (sorted). Agar collection terurut perlu membuat item yang dimasukkan kedalam Set  mengimplements interface Comparable. Interface ini digunakan untuk membandingkan dua buah object, mana object yang lebih besar, lebih kecil atau sama persis.

Interface Comparable hanya mempunyai satu buah method yaitu compareTo, method ini mempunyai sebuah parameter yang bertipe Object kalau tidak menggunakan generics, dan bertipe sama dengan class yang mengimplementasikan interface Comparable kalau menggunakan generics, kembalian method berupa integer, kalau bernilai positif maka object yang dipanggil method comparenya lebih besar dari object yang dimasukkan ke parameter, nilai kembalian negatif sebaliknya, kalau nilai kembalian nol berarti sama besar.

Implementasi Comparable pada class Customer.

import java.lang.Comparable;
public class Customer implements Comparable{
           private Long id;
           public void setId (Long aId){
                      this.id = aId;
           }
           public Long getId (){
                      return this.id;
           }
           public int compareTo(Object o){
                     Customer c = (Customer) o;
                     return getId().compareTo(c.getId());
           }
           public boolean equals(Object obj){
                      if(obj == null){
                                   return false;
                      }
                      if(getClass() != obj.getClass()){
                                    return false;
                      }
                      final Customer other = (Customer) obj;
                      if(this.id != other.id && (this.id != null || !this.id.equals(other.id))){
                                    return false;
                      }
                      return true;
           }
           public int hashCode() {
                    int hash = 7;
                    hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
                    return hash;
           }
}

Kalau menggunakan generics maka parameter method compareTo bukan bertipe Object melainkan Customer.

import java.lang.Comparable;
public class Customer implements Comparable<Customer>{
           private Long id;
           public void setId (Long aId){
                      this.id = aId;
           }
           public Long getId (){
                      return this.id;
           }

           public int compareTo(Customer c){
                      return getId().compareTo(c.getId());
           }
           public boolean equals(Object obj){
                      if(obj == null){
                                   return false;
                      }
                      if(getClass() != obj.getClass()){
                                    return false;
                      }
                      final Customer other = (Customer) obj;
                      if(this.id != other.id && (this.id != null || !this.id.equals(other.id))){
                                    return false;
                      }
                      return true;
           }
           public int hashCode() {
                    int hash = 7;
                    hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
                    return hash;
           }
}

perbandingan dalam method compareTo akan mengurutkan dari id yang kecil ke besar, jika ingin mengurutkan dari id besar ke kecil tinggal dibalik perbandingannya.

public int compareTo(Customer c){
            return c.getId().compareTo(getId());
}

Interface Comparable seperti diatas bisa dilakukan kalau source codenya tersedia misal source code Costumer dapat dimodifikasi class Customer, kalau misalnya class yang ingin diurutkan tidak tersedia source codenya, dapat dilakukan dengan membuat class baru yang meng extends class tersebut sekaligus implements dari class Comparable, sehingga dapat membuat terurut dari class tersebut, kalau classnya berbentuk final yang tidak mungkin di extends dapat dibuat class baru yang implements interface Comparable.

import java.lang.Comparable;
public class CustomerComparable extends Customer implements Comparable<Customer>{
            public int compareTo(Customer c){
                           return getId().compareTo(c.getId());
            }
}

Interface Comparator mempunyai bentuk generics dan bentuk bukan generics, bentuk generics parameter methodnya sudah menjadi class Customer, sedangkan bentuk bukan generics parameternya berbentuk class Object sehingga memerlukan casting untuk diubah menjadi class Customer.

import java.util.Comparator;
public class CustomerComparator implements Comparator<Customer>{
               public  int compare(Customer c1, Customer c2){
                           return c1.getId().compareTo(c2.getId());
               }
}

Setelah Customer mengimplementasi Comparable dapat digunakan collection terurut seperti TreeSet dan TreeMap.

import java.util.Set;
import java.util.TreeSet;
import java.util.Iterator;

public class CustomerTreeSetTest{
            public static void main(String[] args){
                        Set<Customer> customers = new TreeSet<Customer>();
                        Customer c1 = new Customer();
                        c1.setId(1l);  
                        customers.add(c1);
                        Customer c2 = new Customer();
                        c2.setId(2l);
                        customers.add(c2);
                        Customer c = new Customer();
                        c.setId(1l);
                        customers.add(c) // akan direplace yang lama dengan ini
                        Iterator<Customer> iterator = customers.iterator();
                        while(iterator.hasNext()){
                                  Customer current = iterator.next();
                                  System.out.println("Keranjang no - " + current.hashCode() + " id :  " + current.getId());
                        }
            } 
}

Keranjang no - 372 id :  1
Keranjang no - 373 id :  2

TreeSet dan TreeMap mengharuskan item yang dimasukkan mengimplementasikan Comparable. kalau tidak mengimplementasikan buat class Comparator baru yang mengimplementasikan Comparator dan memasukkan object dari class Comparator tersebut kedalam constructor dari TreeSet dan TreeMap tersebut.

Set<Customer> customers = new TreeSet<Customer>(new CustomerComparator());
Map<Customer> customerMaps = new TreeMap<Customer>(new CustomerComparator());

Tidak ada komentar:

Posting Komentar