Java的TreeSet, TreeMap 抽象比較物件

 在 Java 程式語言中, 如果你希望你的陣列可以 自動排列,
事實上有許多的物件已經可以為您達成這項目的,
LinkedList, SortedMap, TreeSet, TreeMap….等等
但是, 如果你希望按照你自己的想法排列呢??
這項排列的規則很可能 並非按照數字, 可能也不是完全與字串的大小有關,
那可能就會很頭痛了!!
 
事實上, 不論是 TreeSet 或是 TreeMap 都有提供一個可以讓你自己建立排列規則的方法,
你只需要繼承一個 java.util.Comparator 介面, 實作 其中的 compare(Object obj1, Object obj2) 方法即可!!
甚至, 你還可以配合不同的 動態抽象方法, 利用 invoke 來動態呈現 要按照何種條件排列的規則!!
 
以下是本人實作的一個例子!!… ( 如要轉載 , 請來信告!! )
在以下的例子當中, 狗的排列, 可以依照其中的 age 屬性排列, 當然你也可以按照 weight 排列 (如果你有實作 weight 方法的話!!)
 
import java.util.TreeSet;
// Comparator 抽象介面必須被實作, Comparate 所用到的
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Comparator;
public class Main {
 public static void main(String[] args) {
         TreeSet ts = new TreeSet(new DogComparate("age"));
         ts.add(new Dog("bbb",8f,9f));
         ts.add(new Dog("aaa",5f,6f));        
         System.out.println( ((Dog) ts.first()).getName() );
 }
}
// DogComparate 比較物件
class DogComparate extends Comparate{
 
 public DogComparate (String attribute){
  this.setAttribute(attribute);
 }
 
 public int name(Dog dog1, Dog dog2){
  if (dog1.getName().equals(dog2.getName()) ){
     return 0;
  }else{
     char [] char1 = null;
     char [] char2 = null;
     boolean b = true;
     if (dog1.getName().length() <= dog2.getName().length()){
      char1 = dog1.getName().toCharArray();
      char2 = dog2.getName().toCharArray();
      b = true;
     }else{
      char1 = dog2.getName().toCharArray();
      char2 = dog1.getName().toCharArray();
      b = false;
     }
     for (int i=0;i<char1.length;i++) {
      if (char1[i] == char2[i]){
       continue;
      }else if (char1[i] > char2[i]){
       return (b ? 1 : -1);
      }else if (char1[i] < char2[i]){
       return (b ? -1 : 1);
         }
     }
     return (b ? -1 : 1);
  }
 }
 public int age(Dog dog1, Dog dog2){
  if (dog1.getAge() > dog2.getAge() ){
      return 1;
  }else if (dog1.getAge() == dog2.getAge() ){
      return 0;
  }else if (dog1.getAge() < dog2.getAge() ){
      return -1;
  }
  return 0;
 }
}
// Comparate 實作 Comparator 的抽象介面
class Comparate implements Comparator{
 private String attribute;
 public String getAttribute() {
  return attribute;
 }
 public void setAttribute(String attribute) {
  this.attribute = attribute;
 }
 public int compare(Object arg0, Object arg1) {
  try {
   Class cls = Class.forName(this.getClass().getName());
      Class[] parTypes = new Class[]{arg0.getClass(), arg1.getClass()};
      Method metd = cls.getMethod(this.attribute, parTypes);
      Comparate metdObj = this;
      Object[] args = new Object[]{arg0, arg1};
      Object rtn = metd.invoke(metdObj, args);
      return ((Integer) rtn).intValue();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (SecurityException e) {
   e.printStackTrace();
  } catch (NoSuchMethodException e) {
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   e.printStackTrace();
  }
  return 0;
 }
}
// Dog 物件, 事實上你不爽要用 Cat 物件都可以!!
class Dog {
    private float age;
    private String name;
    private float weight;
   
    public Dog(String name, float age, float weight){
       this.name = name;
       this.age = age;
       this.weight = weight;
    }
    public void setName(String name){
       this.name = name;
    }
    public String getName(){
       return this.name;
    }
    public void setAge(float age){
       this.age = age;
    }
    public float getAge(){
       return this.age;
    }
    public void setWeight(float weight){
       this.weight = weight;
    }
    public float getWeight(){
       return this.weight;
    }
}
廣告

About fenjj

Perfect !!??...
本篇發表於 Uncategorized。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s