----------------------------------------------------------------------------------------------------------------------------------
集合内排序:
比如 :对列表 List<AsnExpDateDto> 排序:
AsnExpDateDto 类需要实现接口 Comparable
/**
* @author wuao 签注有效期查询Dto 2011-08-30
*
*/
public class AsnExpDateDto implements Comparable<AsnExpDateDto> {
// PILOT_BASIC_INFO
private Integer basicInfoId;// 飞行员基础表主键
private String clerkCode; //工号
private String pilotName;// 飞行员姓名
@Override
public int compareTo(AsnExpDateDto o) {
// TODO 根据本次复训日期进行顺序排序
int monthInt = this.getLicenceEndDate().compareTo(o.getLicenceEndDate());
if(monthInt == 0){
return this.getBenchMonth() - o.getBenchMonth();
}
return monthInt;
}
}
Collections.sort(rstAsnExpDateList);
就可以排序 。
注意的是: 集合内用于排序的接口计算的值不要出现 NULL 的 , 否则,会影响排序结果。
目前 ,我把用于排序的字段的值为空的元素过滤出来, 单独插入到集合的最前 。
for(PeopleDto peopleDto : peopleRstList){
if(asnExpDateDto.getLicenceEndDate() != null){
rstAsnExpDateList.add(asnExpDateDto);
}else{
rstAsnExpDateEmpList.add(asnExpDateDto);
}
}
Collections.sort(rstAsnExpDateList);
rstAsnExpDateList.addAll(0, rstAsnExpDateEmpList);
实现排序接口:
public final class ModelableComparator implements Comparator<Modelable> {
private final List<Long> ids;
public ModelableComparator(List<Long> ids) {
this.ids = ids;
}
protected int getIndex(Long id) {
return ids.indexOf(id);
}
@Override
public int compare(Modelable o1, Modelable o2) {
return (getIndex(o1.getId()) - getIndex(o2.getId()));
}
}
Modelable 接口 :
public interface Modelable {
public Long getId();
public void setId(Long id);
}
排序的时候, List 中的类型要有这个 getId() 方法 。
public class ActivityVO implements Serializable,Modelable{
private Long id; // 标识ID ...........
}
List<ActivityVO> activityVOs;
List<Long> ids=cmsItemService.recommendItemFidListByCod(cmsKey,count);
//按照 ids 的顺序排序
Collections.sort(activityVOs, new ModelableComparator(ids));
对 List 进行多种方式的排序
for(StudentDto dto : context.getWarnStudentList()){
SimCrewAssignCheck simCrewAssignCheck = new SimCrewAssignCheck();
simCrewAssignCheck.setIndex(0L);
simCrewAssignCheck.setUnitName(dto.getDto().getUnitName());
simCrewAssignCheck.setClerkCode(dto.getDto().getClerkCode());
simCrewAssignCheck.setName(dto.getDto().getPilotName());
simCrewAssignCheck.setReason(dto.getErrMsg().toString());
fixEditable(dto, simCrewAssignCheck);
simCrewAssignCheck.setLastDate(dto.getDto().getValidBeginDate());
simCrewAssignCheck.setStandardMonth(dto.getDto().getBenchMonth());
simCrewAssignCheck.setBigErrTypeName(dto.errBigType.optname);
simCrewAssignCheck.setStandard(dto.getDto().getTechnicalStandard());
simCrewAssignCheckList.add(simCrewAssignCheck);
}
//初始化单位列表信息
this.a = context.getA();
//已经按照的顺序是 错误种类 排
//把错误进行排序
if(formCheck.getOrder_type() == 1){//按照 单位+姓名 排
UnitNameComparator compare = new UnitNameComparator();
Collections.sort(simCrewAssignCheckList, compare);
}else if(formCheck.getOrder_type() == 3){//按照 小错误原因+单位+姓名 排
TypeUnitNameComparator compare = new TypeUnitNameComparator();
Collections.sort(simCrewAssignCheckList, compare);
}
比较器的代码:
/**
* 单位 + 姓名 的排序比较器
* @author wuao
*
*/
private class UnitNameComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
SimCrewAssignCheck s1 = (SimCrewAssignCheck) o1;
SimCrewAssignCheck s2 = (SimCrewAssignCheck) o2;
if(s1.getUnitName().equals(s2.getUnitName())){
return s1.getName().compareTo(s2.getName());
}else{
return s1.getUnitName().compareTo(s2.getUnitName());
}
//return 0;
}
}
/**
* 小错误原因+单位+姓名 的排序比较器
* @author wuao
*
*/
private class TypeUnitNameComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
SimCrewAssignCheck s1 = (SimCrewAssignCheck) o1;
SimCrewAssignCheck s2 = (SimCrewAssignCheck) o2;
if(!s1.getReason().equals(s2.getReason())){
return s1.getReason().compareTo(s2.getReason());
}else{
if(s1.getUnitName().equals(s2.getUnitName())){
return s1.getName().compareTo(s2.getName());
}else{
return s1.getUnitName().compareTo(s2.getUnitName());
}
}
//return 0;
}
}
更多Java对象比较器应用,见 :
http://blog.163.com/jean757282710@126/blog/static/114224249201052641741154/