【发布时间】:2013-08-29 15:05:26
【问题描述】:
我有一个元素列表。每个元素都有四个道具。
- 日期对象
- 一个枚举对象(值为 {E-4,D-3,C-2,B-1,A-0})
- 另一个日期对象
- 另一个日期对象。
目前我正在使用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