項目中輸出報表時,需要對List<String>進行排序。由於報表數據是分段獲取的,不能在獲取時排序,只能在輸出時排序。
有兩種情況,一種是表頭排序,另一種數據。
表頭,可以使用如下方法,先定義原始數據表頭,在輸出時位於第幾列:
private static final Map<String,Integer> PERSONAL_SORT = new HashMap<>();
static {
PERSONAL_SORT.put("表頭1", 16);//原始數據第一列,輸出時顯示在第16列
PERSONAL_SORT.put("表頭2", 10);
PERSONAL_SORT.put("表頭3", 5);
PERSONAL_SORT.put("表頭4", 9);
PERSONAL_SORT.put("表頭5", 8);
PERSONAL_SORT.put("表頭6", 2);
PERSONAL_SORT.put("表頭7", 6);
PERSONAL_SORT.put("表頭8", 3);
PERSONAL_SORT.put("表頭9", 14);
PERSONAL_SORT.put("表頭10", 7);
PERSONAL_SORT.put("表頭11", 15);
PERSONAL_SORT.put("表頭12", 11);
PERSONAL_SORT.put("表頭13", 12);
PERSONAL_SORT.put("表頭14", 13);
PERSONAL_SORT.put("表頭15", 4);
PERSONAL_SORT.put("表頭16", 1);
}
再進行排序(selColumnsList是需要排序的對象):
Collections.sort(selColumnsList, new Comparator<String>() {
@Override
public int compare(String s, String t1) {
if(PERSONAL_SORT.get(s) >PERSONAL_SORT.get(t1)) {
return 1;
}else
{
return -1;
}
}
});
數據部分,原始數據是一行行的生成的,因此可以在原始數據的每一行生成後,進行順序調換。
先定義一個數組,用來描述每一行,從原始數據的哪個列取值:
//第5列從原始數據的第20列取值,第6列從原始數據第10列取值
private static int[] COLUMNS_SORT2 = {1,2,3,4,20,10,12,19,7,11,14,9,8,6,16,17,18,13,15,5};
再進行順序調換:
private static List<String> SortList(List<String> list, int[] order) {
if(list.size() != order.length)
//如果指定順序的數組和原始數據長度不一致,直接返回原始數據
return list;
else
{
List<String> newList = new ArrayList<>();
for(int i=0;i<order.length;i++)
{
newList.add(list.get(order[i]-1));
}
return newList;
}
}
當然,表頭也可以用數據的排序方法進行順序調整,效率應該更高,只是用上面的方法更加直觀。
上面表頭順序和數組都可以寫在配置文件裏面,方便調整。