2013-08-29 27 views
0

我有一個元素列表。每個有四個道具的元素。ComparatorChain vs將屬性轉換爲字符串並比較

  1. A Date Obj。
  2. 枚舉的OBJ(值是{E-4,d-3,C-2,B-1,A-0})
  3. 另一個日期的OBJ
  4. 另一個日期的OBJ。

目前我使用一個comparator[MyObjComparator]其中我將每個道具成String並在StringBuilder追加字符串,然後比較所得到的字符串排序的列表中。 我使用dateFormat作爲yyyyMMddHHmmss

另一種方法可以是compatorChain。我可以在MyObjComparator中創建一些內部比較類[我們不能避免使用這個。所有的impl都必須放在compareTo]中,並添加它們來構建比較器鏈並使用它。

現在我的問題是哪一個在性能或壽命方面會很好?

編輯1: 所有四個屬性都應該包含在比較中。 添加代碼卡 1.檢查每個屬性indivitualy

package com.poc.MultiPropComparator.service; 

import java.util.Comparator; 
import java.util.Date; 
import com.poc.MultiPropComparator.domain.MyDomainObject; 
import com.poc.MultiPropComparator.domain.PropertyType; 

public class MyDomainObjectComparator implements Comparator<MyDomainObject>{ 

    @Override 
    public int compare(MyDomainObject o1, MyDomainObject o2) { 

     Date recordDate1 = o1.getRecordDate(); 
     Date recordDate2 = o2.getRecordDate(); 

     if(recordDate1.compareTo(recordDate2)==0){ 
      return compareType(o1,o2); 
     } 
     return recordDate1.compareTo(recordDate2); 
    } 

    private int compareType(MyDomainObject o1, MyDomainObject o2) { 

     PropertyType type1 = o1.getType(); 
     PropertyType type2 = o2.getType(); 

     if(type1.compareTo(type2)==0){ 
      return compareStartDate(o1,o2); 
     } 

     return type1.compareTo(type2); 
    } 

    private int compareStartDate(MyDomainObject o1, MyDomainObject o2) { 

     Date startDate1 = o1.getStartDate(); 
     Date startdDate2 = o2.getStartDate(); 

     if(startDate1.compareTo(startdDate2)==0){ 
      return compareEndDate(o1,o2); 
     } 
     return startDate1.compareTo(startdDate2); 
    } 

    private int compareEndDate(MyDomainObject o1, MyDomainObject o2) { 
     Date endDate1 = o1.getEndDate(); 
     Date endDate2 = o2.getEndDate(); 

     return endDate1.compareTo(endDate2); 
    } 


} 
+0

爲什麼不直接比較日期?日期實施可比較 ... – assylias

+0

爲什麼不對兩種方法進行基準測試?就我個人而言,儘可能避免字符串轉換,但如果您對某個特定方面感興趣,則可以對其進行測試。 –

+0

你必須優先考慮你的支票。例如,首先比較第一個日期對象。如果相等,則比較枚舉對象。等等,你能否提供你建立StringBuilder的方式?你必須自動完成它。 – sp00m

回答

1

一個ComparatorChain(你指的是Apache的百科全書類的吧?)基於在原語(或幾乎原始)類型的個體比較,而不是String如果性能不是很好,轉換應該會更好。特別是,ComparatorChain一旦做出決定就會停止評估(非常類似於快捷方式和(&&)和快捷方式或(||)運算符)。在基於String的比較中,在開始比較之前,您需要全面生成比較數String s(除非要混合兩種方案,這沒有任何意義)。

就壽命而言,字符串連接將導致10000年失敗。這是確定的。除了笑話之外,ComparatorChain策略更容易維護,並且支持enum的可修改性,以及以更好的方式添加比較字段。

相關問題