我有一个元素列表。每个元素都有四个道具。
- 日期对象
- Enum Obj(值为{E-4,D-3,C-2,B-1,A-0})
- 另一个日期Obj
- 另一个日期对象。
醇>
目前我正在使用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);
}
}
答案 0 :(得分:1)
A ComparatorChain
(您指的是Apache Commons类吗?),基于原始(或几乎是原始)类型而不是String
转换的单个比较器应该有更好的,如果不是更好性能。特别是,ComparatorChain
一旦做出决定就会停止评估(非常类似于快捷方式和(&&
)和快捷方式或(||
)运算符。在基于String
的比较中,您需要在开始比较之前完整地生成两个比较String
(除非您想要混合两种方案,这没有任何意义)。< / p>
就长寿而言,字符串连接将在10,000年失败。这是肯定的。除此之外,ComparatorChain
策略更容易维护,并支持对enum
进行可能的修改,以及以更好的方式添加字段进行比较。