小记:
Comparable接口:只有一个compareTo(T o)方法;一般由类实现该接口
Comparator接口:方法很多但只需要重写compare(T o1, T o2)方法,其他方法不用实现,因为jdk8以后,接口中用default修饰的方法可以有方法体,类似抽象类。一般用于匿名内部类
简单实例:
BigDecimal实现了Comparable接口,所以内部可以直接调用o1.compareTo(o2);Character是字符操作类,Character.isDigit(char c)判断是不是数字。
List<Vouchers> vouchers_Acc = new ArrayList<Vouchers>();
Collections.sort(vouchers_Acc, new Comparator<Voucher>(){ // 根据account_no排序
@Override
public int compare(Voucher o1, Voucher o2) {
if (o1 instanceof Voucher && o2 instanceof Voucher) {
Voucher v1 = (Voucher)o1;
Voucher v2 = (Voucher)o2;
BigDecimal acc_no1 = new BigDecimal((ValidTools.isMath(v1.getAccount_no()) ? v1.getAccount_no() : "0"));
BigDecimal acc_no2 = new BigDecimal((ValidTools.isMath(v2.getAccount_no()) ? v2.getAccount_no() : "0"));
return acc_no1.compareTo(acc_no2);
}
return 0;
}
});
TreeSet存储自定义类型要实现Comparator接口。
vouchers_Prj = new TreeSet<Voucher>(new Comparator<Voucher>() {
@Override
public int compare(Voucher o1, Voucher o2) {
if (o1 instanceof Voucher && o2 instanceof Voucher) {
Voucher v1 = (Voucher)o1;
Voucher v2 = (Voucher)o2;
BigDecimal prj_code1 = new BigDecimal((ValidTools.isMath(v1.getPrj_code()) ? v1.getPrj_code() : "0"));
BigDecimal prj_code2 = new BigDecimal((ValidTools.isMath(v2.getPrj_code()) ? v2.getPrj_code() : "0"));
return prj_code1.compareTo(prj_code2);
}
return 0;
}
});
3、也可以在实体类中实现Comparator接口
那么在调用Collections.sort的时候可以直接这样调用:
Collections.sort(entry.getValue(), new AggInvAna());
public class AggInvAna implements Comparator<AggInvAna> {
private String dDate;
public String getdDate() {
return dDate;
}
public void setdDate(String dDate) {
this.dDate = dDate;
}
@Override
public int compare(AggInvAna o1, AggInvAna o2) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return format.parse(o1.getdDate()).compareTo(format.parse(o2.getdDate()));
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
}
Collections.sort(entry.getValue(), new AggInvAna());