Collection工具实现排序

----------------------------------------------------------------------------------------------------------------------------------

 

集合内排序:

 

比如 :对列表 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/

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值