0

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

  1. 日期对象。
  2. 枚举 Obj(值为 {E-4,D-3,C-2,B-1,A-0})
  3. 另一个约会对象
  4. 另一个日期对象。

目前,我正在使用 a 对列表进行排序,comparator[MyObjComparator]其中我将每个道具转换为String并将字符串附加到 a 中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);
    }


}
4

1 回答 1

1

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

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

于 2013-08-29T15:16:49.383 回答