需求:前端根據后端的返回數據:畫統計圖;
1.動態獲取地域數據以及數據中的平均值,按照平均值降序排序;
說明:
X軸是動態的,有對應區域數據則展示;
X軸 區域數據降序排序;
代碼:
@Overridepublic List<Map<String,Object>> getTimeData(HttpServletRequest request, Map<String, Object> paramMap) {List<Map<String,Object>> list = getCountData(request,paramMap);list = list.stream().filter(e -> (e.get("status").equals("關閉"))).collect(Collectors.toList());// Map存儲:(region,num),num為相同region的加和;Map<String,Object> regionMap = new HashMap<>();// Map存儲:(region,統計次數),統計次數為相同region的次數;Map<String,Object> countMap = new HashMap<>();for (int i = 0; i < list.size(); i++) {String region = String.valueOf(list.get(i).get("region"));String num = String.valueOf(list.get(i).get("processTime"));// regionMap包含region:將region當作key;if(regionMap.containsKey(region)) {String key = region;String value = String.valueOf(regionMap.get(key)); // 從regionMap獲取value值;即地域對應的num值;regionMap.put(region, Double.parseDouble(value) + Double.parseDouble(num));}else { // 不包含,直接存進去regionMap.put(region, num);}// countMap包含region:將region當作key;if(countMap.containsKey(region)) {String key2 = region;String value2 = String.valueOf(countMap.get(key2)); // 從countMap獲取value值;即地域對應的統計次數值;countMap.put(region, Integer.valueOf(value2) + 1);}else { // 不包含,直接存進去countMap.put(region, 1);}}List<String> regionList = new LinkedList<String>(); // 地域List<String> numberList = new LinkedList<String>(); // 數值List<String> countList = new LinkedList<String>(); // 統計次數List<String> avgList = new LinkedList<String>(); // 平均值// 封裝地域集合:(北京,數值和)Iterator<Map.Entry<String, Object>> it = regionMap.entrySet().iterator();while(it.hasNext()){Map.Entry<String, Object> entry = it.next();String key = entry.getKey();String value = String.valueOf(entry.getValue());regionList.add(key);numberList.add(value);}// 封裝統計次數集合:(北京,統計次數)Iterator<Map.Entry<String, Object>> it2 = countMap.entrySet().iterator();while(it2.hasNext()){Map.Entry<String, Object> entry = it2.next();String value = String.valueOf(entry.getValue());countList.add(value);}// 計算平均值:封裝集合avgListif(numberList.size() == countList.size()) {for (int i = 0; i < numberList.size(); i++) {double fenzi = Double.parseDouble(numberList.get(i));int fenmu = Integer.valueOf(countList.get(i));if(fenmu > 0) {Double x = fenzi/fenmu;// double類型的數據當分母的數值趨近0的時候,返回來的數值就是一個NAN:if(Double.isNaN(x)){x = 0.0;}avgList.add(String.valueOf(x));}}}// 最終輸出集合:List<Map<String,Object>> resultList = new ArrayList<>();// 根據地域集合與平均值集合封裝新集合resultList:if(regionList.size() == avgList.size()) {for (int i = 0; i < regionList.size(); i++) {Map<String,Object> map = new HashMap<>();map.put("title",regionList.get(i));map.put("value",avgList.get(i).substring(0,avgList.get(i).indexOf(".")+2));resultList.add(map);}}//排序:value值大的Map往前排,斌且插入新字段:sortValue,代表序列;Double[] valueSort = new Double[resultList.size()];String[] titleSort = new String[resultList.size()];// 排序后最終輸出集合:List<Map<String,Object>> listFinal= new ArrayList<>();// 獲取排序的數組:for (int i = 0; i < resultList.size(); i++) {valueSort[i] = Double.parseDouble(String.valueOf(resultList.get(i).get("value")));titleSort[i] = String.valueOf(resultList.get(i).get("title"));}// 數組排序:BubblSortUtils.bubbleSortDescMultipleDouble(valueSort,titleSort);// 數組封裝listFinal:for (int i = 0; i < valueSort.length; i++) {String ch = String.valueOf(titleSort[i]);for (int j = 0; j < resultList.size(); j++) {String value = String.valueOf(resultList.get(j).get("title"));if(ch.equals(value)){listFinal.add(resultList.get(j));}}}// listFinal中添加排序字段:sortValuefor (int i = 0; i < listFinal.size(); i++) {listFinal.get(i).put("sortValue",i+1);}return listFinal;}
Postman接口測試: