工具类
@Component
public class SortListUtil<E> {
/**
*
* @param list 需排序的集合
* @param method 字段名称
* @param sort 排序方式
*/
public static void sort(List list, final String method, final String sort) {
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
int ret = 0;
try {
//获取类本身的属性成员
Field f1 = o1.getClass().getDeclaredField(method);
f1.setAccessible(true);//跳过安全检查,因为属性是private修饰的
Object s = f1.get(o1);
Object s1 = f1.get(o2);
//需转换类型为原本类型,不能全部都用String类型比较
if ((f1.getType() == Integer.class) && (f1.getType() == Integer.class)) {
if (StringUtils.isNotEmpty(sort) && "desc".equals(sort)) {
ret = ((Integer) s1).compareTo(((Integer) s));
} else {
ret = ((Integer) s).compareTo(((Integer) s1));
}
}
//f1.getType() == String.class 和 s instanceof String 两种方式都可以
if ((s instanceof String) && (s1 instanceof String)) {
if (StringUtils.isNotEmpty(sort) && ERPService.DESC.equals(sort)) {
ret = s1.toString().compareTo(s.toString());
} else {
ret = s.toString().compareTo(s1.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
});
}
}
测试
测试demo
public static void main(String[] args) {
ArrayList<DataAnalysisVo> dataAnalysisVos = new ArrayList<>();
dataAnalysisVos.add(new DataAnalysisVo().setSignedQuantity(100).setVolume(50).setSigningRate(0.20));
dataAnalysisVos.add(new DataAnalysisVo().setSignedQuantity(100).setVolume(40).setSigningRate(0.25));
dataAnalysisVos.add(new DataAnalysisVo().setSignedQuantity(100).setVolume(100).setSigningRate(1.00));
dataAnalysisVos.add(new DataAnalysisVo().setSignedQuantity(90).setVolume(30).setSigningRate(0.30));
SortListUtil.sort(dataAnalysisVos,"volume","desc");
System.out.println(dataAnalysisVos.toString());
}
测试结果
测试类
/**
* 数据分析单条数据
*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
public class DataAnalysisVo {
private String cityName;
/**
* 人员名称数量或名称
*/
private String staffCount;
/**
* 签单量
*/
private Integer signedQuantity;
/**
* 成交量
*/
private Integer volume;
/**
* 签单率
*/
private Double signingRate;
}