在工作中遇到了需要按某一实体类多维度排序的场景。(Hbase备份Orcale字段 检索查询后order by操作)
- 获取需要字段后封装进实体类,另外保存需要排序的字段。
public class SortEntity {
private String entityString; //用于存放其余拼接字段
private String compactor = null; // 第一个排序参数
private String secondCompactor = null; // 第二个用于排序的参数
private String thirdCompactor = null;//第三个排序参数
public SortEntity() {
}
public SortEntity(String entityString, String compactor, String secondCompactor) {
this.entityString=entityString;
this.compactor=compactor;
this.secondCompactor=secondCompactor;
}
public String getCompactor() {
return compactor;
}
public void setCompactor(String compactor) {
this.compactor = compactor;
}
public String getSecondCompactor() {
return secondCompactor;
}
public void setSecondCompactor(String secondCompactor) {
this.secondCompactor = secondCompactor;
}
public String getEntityString() {
return entityString;
}
public void setEntityString(String entityString) {
this.entityString = entityString;
}
public String getThirdCompactor() {
return thirdCompactor;
}
public void setThirdCompactor(String thirdCompactor) {
this.thirdCompactor = thirdCompactor;
}
@Override
public String toString() {
return "SortEntity [entityString=" + entityString + ", compactor=" + compactor + ", secondCompactor=" + secondCompactor + ", thirdCompactor=" + thirdCompactor + "]";
}
}
- 假设上述实体类就是需要的内容 利用jdk8 List Compactor进行排序:
/*
*
* 功能:排序
* @param a
* @param b
* @param desc 是否降序
* @return
*/
public static int compactor(String a,String b,boolean desc){
if(desc)
return -compactorS(a, b);
else
return compactorS(a, b);
}
/**
*
* 功能:确保排序的如果是数字不可以带小数或者空格 否则就变为了字典顺序
* @param a
* @param b
* @return
*/
public static int compactorS(String a,String b){
if(StringUtils.isNumeric(a)){
return compactorInteger(Integer.parseInt(a),Integer.parseInt(b));
}else{
return a.compareTo(b);
}
}
public static int compactorInteger(Integer a,Integer b){
if(a>b)return 1;
if(a<b)return -1;
return 0;
}
public static void main(String[] args) {
List<SortEntity> list = new ArrayList<>();
list.add(new SortEntity("abc","3","5"));
list.add(new SortEntity("abc","3","4"));
list.add(new SortEntity("abc","4","3"));
list.add(new SortEntity("abc","4","2"));
list.add(new SortEntity("abc","4","3"));
list.sort(Comparator.comparing(SortEntity::getCompactor,(f,s)->compactor(f, s,true))
.thenComparing(SortEntity::getSecondCompactor,(f,s)-> compactor(f, s, true)));
list.forEach(System.out::println);
}
输出:
SortEntity [entityString=abc, compactor=4, secondCompactor=3, thirdCompactor=null]
SortEntity [entityString=abc, compactor=4, secondCompactor=3, thirdCompactor=null]
SortEntity [entityString=abc, compactor=4, secondCompactor=2, thirdCompactor=null]
SortEntity [entityString=abc, compactor=3, secondCompactor=5, thirdCompactor=null]
SortEntity [entityString=abc, compactor=3, secondCompactor=4, thirdCompactor=null]
关键代码解释:
list.sort(Comparator.comparing(SortEntity::getCompactor,(f,s)->compactor(f, s,true))
SortEntity::getCompactor,(f,s) f为当前SortEntity类getCompactor方法获取的值 s为下一个SortEntity类getCompactor方法获取的值, 之后使用compactor方法对比两个值。compactor返回结果为-1 f在s前面 ,为1 则f在s后面 。
多维则在后面增加thenComparing方法 即上述值为0时再执行。n维则添加n-1个thenComparing方法即可。