在写报表项目的过程中,遇到了一个很有意思的问题,展现在前端页面的最终结果样式,是由三个或者多个部分拼装到一起的,每一个部分的数据独立,需要排序以后拼装到一起。简单来说,就是每一个部分的数据查询计算出结果以后,不需要的数据删除,需要的数据按规定排序,再和其他部分的数据拼装到一起。
比方说上面一个结果样式,就是有最大两部分拼装,分上下两部分,上下部分又各分三部分,即贷款余额表、贷款客户表和授信客户表,需要每一部分的数据拼装到一起,才是最终结果。
所以,这就需要考量每一部分的List.size是否相等的情况,不相等,自行增加String[]使相等,其实逻辑理顺,代码就很简单啦:
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
public class TestList {
/**
* 排序公共方法
*
* @param list
* 原始集合
* @param int
* 排序位数
*/
public static void sortMethod(List<String[]> list, final int sort) {
Collections.sort(list, new Comparator<String[]>() {
public int compare(String[] arg1, String[] arg2) {
double d = Double.parseDouble(arg1[sort]) - Double.parseDouble(arg2[sort]);
if (d > 0) {
return -1;
} else if (d == 0) {
return 0;
} else {
return 1;
}
}
});
}
// 根据名称删除不需要的数据
public static List<String[]> CityNameRemoveMethod(List<String[]> strList, String cityName) {
for (int i = strList.size() - 1; i >= 0; i--) {
if (strList.get(i)[0].equals(cityName)) {
strList.remove(i);
System.out.println("删除指定" + cityName + "数据成功!");
}
}
return strList;
}
// 调用该方法需保证两个list的size相同 不然无法拼接
public static List<String[]> TogetherList(List<String[]> oneList, List<String[]> twoList) {
List<String[]> result = new LinkedList<String[]>();
String[] sub = new String[oneList.size() + twoList.size()];
// 需要判断哪个size小
if (oneList.size() == twoList.size()) {
for (int i = 0; i < oneList.size(); i++) {
sub = concat(oneList.get(i), twoList.get(i));
result.add(sub);
}
} else {
System.err.println("两个集合的size不同");
}
return result;
}
// 两个数组合二为一
public static String[] concat(String[] one, String[] two) {
String[] str = new String[one.length + two.length];
System.arraycopy(one, 0, str, 0, one.length);
System.arraycopy(two, 0, str, one.length, two.length);
return str;
}
// 自动填充数据
public static List<String[]> addString(List<String[]> oneList, int size) {
// 判断长
int len = 0;
for (String[] strArr : oneList) {
len = strArr.length;
if (len != 0) {
break;
}
}
String[] str = new String[len];
for (int i = 0; i < str.length; i++) {
str[i] = "0"; // 默认填0
}
if (oneList.size() >= size) {
System.err.println("根本不需要填充");
return null;
}
while (oneList.size() < size) {
oneList.add(str);
}
oneList.add(str); // 现在size肯定等
if (oneList.size() == size) {
System.err.println("填充完毕");
return oneList;
} else {
System.err.println("出错");
return null;
}
}
}
方法比较简单,就是觉得这种报表也是有意思,因为源数据可控性不是非常高,所以就记录一下咯。