2013-08-29 26 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的可修改性,以及以更好的方式添加比较字段。

相关问题