今天在项目中遇到的问题,不能在sql中进行order by。所以将数据库中查询出来的集合,在java代码中进行排序。
直接上代码:
package com.ly.hcms.common.utils;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* zhaoshuxiang
*/
public class SortUtil {
private final static String SORT_ASC = "ASC";
private final static String SORT_DESC = "DESC";
/**
* 集合排序
* @param list 需排序的集合
* @param property 元素名称
* @param sort 排序方式
* @param <T>
* @return
*/
public static <T> void sortList(List<T> list, String property, String sort) {
Collections.sort(list, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
try {
Field field1 = o1.getClass().getDeclaredField(property);
field1.setAccessible(true);
Integer i1 = Integer.parseInt(getNumber(field1.get(o1).toString()));
Field field2 = o2.getClass().getDeclaredField(property);
field2.setAccessible(true);
Integer i2 = Integer.parseInt(getNumber(field2.get(o2).toString()));
//降序
if (sort.toUpperCase().equals(SORT_DESC))
return i2.compareTo(i1);
//升序
if (sort.toUpperCase().equals(SORT_ASC))
return i1.compareTo(i2);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
});
}
/**
* 提取数字
*
* @param str
* @return
*/
public static String getNumber(String str) {
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}
}
或者纯lambda写法:
package com.ly.hcms.common.utils;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* zhaoshuxiang
*/
public class SortUtil {
private final static String SORT_ASC = "ASC";
private final static String SORT_DESC = "DESC";
/**
* 集合排序
* @param list 需排序的集合
* @param property 元素名称
* @param sort 排序方式
* @param <T>
* @return
*/
public static <T> void sortList(List<T> list, String property, String sort) {
Collections.sort(list, (o1, o2) -> {
try {
Field field1 = o1.getClass().getDeclaredField(property);
field1.setAccessible(true);
Integer i1 = Integer.parseInt(getNumber(field1.get(o1).toString()));
Field field2 = o2.getClass().getDeclaredField(property);
field2.setAccessible(true);
Integer i2 = Integer.parseInt(getNumber(field2.get(o2).toString()));
//降序
if (sort.toUpperCase().equals(SORT_DESC))
return i2.compareTo(i1);
//升序
if (sort.toUpperCase().equals(SORT_ASC))
return i1.compareTo(i2);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
});
}
/**
* 提取数字
*
* @param str
* @return
*/
public static String getNumber(String str) {
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}
}
参数说明:
- list 需排序的集合
- property 排序所依据的元素
- sort 排序方式
举例:
public class price {
private String date;
private BigDecimal dailyPrice;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public BigDecimal getDailyPrice() {
return dailyPrice;
}
public void setDailyPrice(BigDecimal dailyPrice) {
this.dailyPrice = dailyPrice;
}
}
对List<Price> 根据Price的date元素正序排序写法:
SortUtil.sortList(prices, "date", "ASC");
- 注:date 为String类型 值示例:2020-05-18
排序时会转为Integer类型:20200518