網頁

2014年1月12日 星期日

Effective Java實作Comparator

如果集合或陣列內的物件,有1個以上不同的排序邏輯時,那該如何處理呢?尤其是當已經實現了Comparable,又不能變動原本的邏輯時,Mix會採用Comparator來處理。






這就有點像外掛,需要的時候可以切換不同的商務邏輯,也就是邏輯與模型分離,這樣的便利性,讓Mix可以不斷地擴充排序邏輯。

建立1個新的class,implements Comparator,同時實作compare()這個method,以name+id作為排序邏輯,先比較name,當等於0時,再來比較id排序。

package org.openyu.java.role.vo.impl;

import java.util.Comparator;

import org.openyu.java.role.vo.Role;

/**
 * The Class RoleNameComparator.
 */
public class RoleNameComparator implements Comparator<role> {

 /**
  * Instantiates a new role name comparator.
  */
 public RoleNameComparator() {

 }

 /*
  * (non-Javadoc)
  *
  * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
  */
 public int compare(Role o1, Role o2) {
  long id1 = o1.getId();
  long id2 = o2.getId();
  String name1 = o1.getName();
  String name2 = o2.getName();

  // 排序: name+id
  int result = name1.compareTo(name2);
  if (result == 0) {
   if (id1 > id2) {
    return 1;
   } else if (id1 < id2) {
    return -1;
   } else {
    return 0;
   }
  }
  return result;
 }
}





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

 /**
  * Compare.
  */
 @Test
 public void compare() {
  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, new RoleNameComparator());
  System.out.println("after sort: ");
  for (Role r : roles) {
   System.out.println(r);
  }
 }






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





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=3, name=Java, strength=0]
[id=1, name=OpenYu, strength=0]
[id=2, name=OpenYu, strength=0]











  1. 實作compare()。



沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...