jasperreport没有内置的排序功能;在pdf进行group的时候,除非你在sql中进行了排序,否则group的结果会让人感到很杯具。
所以就写了这个东东。完整代码见附件
几个类:
Order:设置按属性排序,DESC,ASC
Util:设定支持原生类型
Main:排序类
用法:
Order order = new Order().add("city", Order.ASC).add("id", Order.DESC);
List result = m.getOrderedData(list, order);
使用规则:
所有排序的属性都实现了Comparable接口(原生类型会转成包装类型)
另外给出关键代码段
@SuppressWarnings("unchecked")
private List<?> getOrderedData(List<?> list, final Order order) {
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
try {
return compareByOrder(o1, o2, order);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
};
Collections.sort(list, comparator);
return list;
}
@SuppressWarnings("unchecked")
private int compareByOrder(Object obj1, Object obj2, Order order) throws Exception {
if (order == null) {
return 0;
}
int i = 0;
while (i < order.size()) {
String property = order.getKeyByIndex(i);
Boolean sc = order.getValueByKey(property);
Comparable p1 = getProperty(obj1, property);
Comparable p2 = getProperty(obj2, property);
if (p1 != null && p2 != null) {
if (p1.compareTo(p2) != 0) {
return sc ? p1.compareTo(p2) : p2.compareTo(p1);
}
}
i++;
}
return 0;
}
@SuppressWarnings("unchecked")
private Comparable getProperty(Object bean, String property) throws Exception {
Class<?> clazz = PropertyUtils.getPropertyType(bean, property);
Object obj = PropertyUtils.getProperty(bean, property);
if (clazz.isPrimitive()) {
clazz = Util.getPrimitiveClass2Wrapper(clazz);
obj = clazz.cast(obj);
}
Class<?> tempClazz = clazz;
boolean flg = false;
while (tempClazz.getSuperclass() != null) {
Class[] interfaces = tempClazz.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
if (interfaces[i].getName().equals(Comparable.class.getName())) {
flg = true;
break;
}
}
tempClazz = tempClazz.getSuperclass();
}
if (flg) {
return (Comparable) obj;
}
throw new RuntimeException("the property '" + property + "' must be implement Comparable interface");
}
分享到:
相关推荐
关机的小玩意儿,可以整整人用,对计算机无任何危害,给无聊的生活带来一丝乐趣
【标题】:“超级非常好玩的小玩意儿” 这个标题虽然略带俏皮,但它暗示着我们即将探讨的是一个有趣且引人入胜的IT项目。在IT领域,"小玩意儿"通常指的是小型应用、工具或者趣味性的编程项目,可能是利用JavaScript...
"小玩意儿 - 远程控制台组件"是一款开源的工具,主要功能是提供远程控制台服务,使得用户可以通过网络对远程服务器进行命令行操作,从而实现远程管理和维护。这个组件可能包含了一些核心功能,例如连接管理、命令...
标题中的“windows桌面玩意儿可爱的小绵羊”指的是Windows操作系统上的一个桌面宠物软件,它以小绵羊的形象呈现,为用户带来趣味性和娱乐性。在Windows操作系统中,这类软件通常作为个性化工具,允许用户在桌面上...
【描述】"求婚写的小玩意儿 大家可以使用"表明这是一个公开分享的资源,旨在帮助人们创建个性化且具有科技感的求婚体验。这种应用可能包含了动态效果、个性化信息展示,以及可能的人工智能元素,比如语音识别、情感...
一年级下册道德与法治做个小玩意儿|教科PPT学习教案.pptx
简单的归并排序和快排算法实现,首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一...
初中语文文摘社会会来事儿这玩意儿
windows桌面玩意儿~超可爱的桌面宠物猫之二
windows桌面玩意儿~超可爱的桌面宠物猫之三
windows桌面玩意儿~超可爱的桌面宠物猫之一
一个猜数字的小玩意
STM32F103C8T6是意法半导体(STMicroelectronics)生产的一款高性能、低成本的微控制器,属于STM32系列的入门级产品。它基于ARM Cortex-M3内核,工作频率可达72MHz,具有丰富的外设接口和高达64KB的闪存,适用于各种...
读《历史是个什么玩意儿》有感,700字.doc
小小玩意儿,单片机、SD卡、3310LCD做的个音乐播放器
标题中的“非常简单的小玩意,但可以扩展功能哦”暗示我们这是一个简单的项目,可能是互动性的,具有可扩展性,适合初学者练习。描述进一步说明这是一个JavaScript(js)的小型演示项目,适合刚入门的JavaScript...
在“财务是个什么玩意儿.pptx”这份文档中,作者WangSX通过七个部分,深入浅出地介绍了财务的各个层面,旨在帮助读者建立财务思维框架。 首先,文档从背景和目的出发,指出财务知识的重要性。对于那些对财务原理...