【问题标题】:ComparatorChain vs Convert property to String and compareComparatorChain vs 将属性转换为字符串并进行比较
【发布时间】:2013-08-29 15:05:26
【问题描述】:

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

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

目前我正在使用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);
    }


}

【问题讨论】:

  • 为什么不直接比较日期呢?日期实现 Comparable...
  • 为什么不对这两种方法进行基准测试呢?就我个人而言,我会尽可能避免字符串转换,但如果您对某个特定方面感兴趣,您可以对其进行测试。
  • 您必须优先处理您的支票。例如,首先,比较第一个日期对象。如果相等,则比较枚举对象。等等。你能提供你构建 StringBuilder 的方式吗?您一定是自动完成的。
  • @sp00m 比较器可以按优先级降序追加,并为每个字段使用固定宽度格式。

标签: java performance comparator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多