Java8 對矩陣進行組合排序

首先,常規的實體類的多條件排序可參考:

Java8:Lambda表達式增強版Comparator和排序

java8-Lambda中比較器Comparator的使用

我們有個Matrix 多條件排序要求,矩陣的列動態生成,程序可以知道該列是定性的還是定量的值。用戶在瀏覽這個Matrix 的時候,他會選擇若干個列,每個列的升降序和排序優先級進行排序,後臺負責做真分頁排序。

比如一個matrix 的數據格式如下,java 使用的數據結構爲:List<LinkedHashMap<String, Object>>,這樣可以動態保存Matrix:

{"PERSON_ID":"11601","cataracta":"N","AGE":"50","GENDER":"N"},{"PERSON_ID":"10211","cataracta":"N","AGE":"51","GENDER":"Y"}

前端的排序請求體爲:

{"analyseId":0,"cohortDefId":1960,"filters":[],"currentPage":1,"sort":{"AGE":"ASC","GENDER":"DESC"}}

主要是 sort 字段,排在前面的 AGE 優先級高於後面的 GENDER。明顯地,AGE 是定量的值,GENDER是定性的。

程序先要根據用戶選擇的排序列構造一個 comparator 的列表,數據的值類型決定了比較的方式(comparator 裏面的比較邏輯實現)。Comparator 的實例構造的方法有限,不得不先取一個 comparator 作爲 nullsFirst 方法的參數實例化,然後就可以對剩餘的 comparator 串行化,最後總的排序實例傳給被排序的數據集進行排序。

LinkedList<Comparator<LinkedHashMap<String, Object>>> comparators = new LinkedList<>();
for (String varName : sortMap.keySet()){
	if ("NUM".equals(varTypes.get(varName))){ // NUM 表示變量是定量的值,要轉化爲 BigDecimal 後進行比較
		try {
			comparators.add((Comparator<LinkedHashMap<String, Object>> & Serializable) (
					LinkedHashMap<String, Object> o1,
					LinkedHashMap<String, Object> o2) -> new BigDecimal(String.valueOf(o1.get(varName)))
							.compareTo(new BigDecimal(String.valueOf(o2.get(varName)))));
		} catch (Exception e) {
			logger.error("當前變量在轉型時出錯,錯誤爲::" + e.getMessage());
		}
	} else { // 定性的轉化爲 String 直接比較
		comparators.add((Comparator<LinkedHashMap<String, Object>> & Serializable) (
				LinkedHashMap<String, Object> o1,
				LinkedHashMap<String, Object> o2) -> String.valueOf(o1.get(varName))
						.compareTo(String.valueOf(o2.get(varName))));
	}
}
logger.info("完成排序驅動的實例化");
Comparator sortings = Comparator.nullsFirst(comparators.poll()); // 先要構造一個 comparator 實例
List<String> rest = new ArrayList<>(sortMap.values());
rest.remove(rest.get(0));
for (String asc : rest){
	sortings = sortings.thenComparing("asc".equalsIgnoreCase(asc) ? comparators.poll() : comparators.poll().reversed());
}
list.sort(sortings);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章