網頁

2014年1月11日 星期六

Effective Java實作Comparable

當集合或陣列內的物件需要排序時,會利用Collections.sort或Arrays.sort來進行排序,通常會implement Comparable,來實現自定義排序,透過回傳值來表示排序的大小。





假設有兩個物件A,B,傳回值說明如下:
  1. 當 A > B,則傳回 1。
  2. 當 A = B,則傳回 0。
  3. 當 A < B,則傳回-1。

Mix多增加implement Comparable,裡面只有ㄧ個compareTo()的方法,那是需要實作的部份。

package org.openyu.java.role.vo;

import java.io.Serializable;

/**
 * The Interface Role.
 *
 * 寫上註解
 */
                              //支援序列化    //支援複製   //支援比較
public interface Role extends Serializable, Cloneable, Comparable<role> {
...
}






Mix取id來作排序,其他field先不考慮排序功能。

 /*
  * (non-Javadoc)
  *
  * @see java.lang.Comparable#compareTo(java.lang.Object)
  */
 public int compareTo(Role o) {
  long id = o.getId();
  if (this.getId() > id) {
   return 1;
  } else if (this.getId() < id) {
   return -1;
  } else {
   return 0;
  }
 }






實作compareTo()之後,Mix執行一次測試方法compareTo(),來查看其結果。

 /**
  * Compare to.
  */
 @Test
 public void compareTo() {
  Role role = new RoleImpl();
  role.setId(1);
  role.setName("OpenYu");
  //
  Role role2 = new RoleImpl();
  role2.setId(2);
  role2.setName("OpenYu");
  //
  int result = role.compareTo(role2);
  System.out.println(result);
  assertEquals(-1, result);
  //

  Role role3 = new RoleImpl();
  role3.setId(3);
  role3.setName("Java");
  //
  Role[] roles = new Role[] { role2, role, role3 };
  System.out.println("before sort: ");
  for (Role r : roles) {
   System.out.println(r);
  }
  //
  System.out.println();
  Arrays.sort(roles);
  System.out.println("after sort: ");
  for (Role r : roles) {
   System.out.println(r);
  }
 }






測試成功了,滿足了實作 compareTo()。




console查看其結果。

-1
before sort: 
[id=2, name=OpenYu, strength=0]
[id=1, name=OpenYu, strength=0]
[id=3, name=Java, strength=0]

after sort: 
[id=1, name=OpenYu, strength=0]
[id=2, name=OpenYu, strength=0]
[id=3, name=Java, strength=0]





利用Apache Commons CompareToBuilder來實作。

 /*
  * (non-Javadoc)
  *
  * @see java.lang.Comparable#compareTo(java.lang.Object)
  */
 public int compareTo(Role o) {
  return new CompareToBuilder()
  .append(this.getId(), o.getId())
  .toComparison();
 }





  1. Effective Java Item 12:考慮實作Comparable



沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...