ComparatorChain vs Convert属性为String并进行比较

时间:2013-08-29 15:05:26

标签: java performance comparator

我有一个元素列表。每个元素都有四个道具。

  
      
  1. 日期对象
  2.   
  3. Enum Obj(值为{E-4,D-3,C-2,B-1,A-0})
  4.   
  5. 另一个日期Obj
  6.   
  7. 另一个日期对象。
  8.   

目前我正在使用comparator[MyObjComparator]对列表进行排序,我将每个道具转换为String并将字符串附加到StringBuilder中,然后比较结果字符串。 我正在使用dateFormat作为yyyyMMddHHmmss

另一种方法可能是compatorChain。我可以在MyObjComparator中创建一些内部比较器类[我们无法避免使用它。所有impl必须进入compareTo]并添加它们以构建比较器链并使用它。

现在我的问题是哪一个在性能或寿命方面会很好?

编辑1: 所有四个属性都应包含在比较中。 添加代码捕捉 1.独立检查每个房产

 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);
    }


}

1 个答案:

答案 0 :(得分:1)

A ComparatorChain(您指的是Apache Commons类吗?),基于原始(或几乎是原始)类型而不是String转换的单个比较器应该有更好的,如果不是更好性能。特别是,ComparatorChain一旦做出决定就会停止评估(非常类似于快捷方式和(&&)和快捷方式或(||)运算符。在基于String的比较中,您需要在开始比较之前完整地生成两个比较String(除非您想要混合两种方案,这没有任何意义)。< / p>

就长寿而言,字符串连接将在10,000年失败。这是肯定的。除此之外,ComparatorChain策略更容易维护,并支持对enum进行可能的修改,以及以更好的方式添加字段进行比较。