說明:
前端使用:vue3.0 ECharts可視化庫
前后端對接數(shù)據(jù)格式:無非就是前端把后端返回的數(shù)據(jù)處理為自己想要的格式,或者,后端給前端處理好想要的格式;
針對前后端的柱狀圖,趨勢圖等數(shù)據(jù)對接,前端一般需要數(shù)組格式;
我們之前返回的數(shù)據(jù)格式是LIst Map
舉例:動態(tài)數(shù)據(jù)統(tǒng)計思路案例(動態(tài),排序,containsKey)五(117)
如圖所示;
而我們需要數(shù)組格式:
后端代碼處理:
@Override
public 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("關(guān)閉"))).collect(Collectors.toList());
// Map存儲:(region,num),num為相同region的加和;
Map<String,Object> regionMap = new LinkedHashMap<>();
// Map存儲:(region,統(tǒng)計次數(shù)),統(tǒng)計次數(shù)為相同region的次數(shù);
Map<String,Object> countMap = new LinkedHashMap<>();
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當(dāng)作key;
if(regionMap.containsKey(region)) {
String key = region;
String value = String.valueOf(regionMap.get(key)); // 從regionMap獲取value值;即地域?qū)?yīng)的num值;
regionMap.put(region, Double.parseDouble(value) + Double.parseDouble(num));
}
else { // 不包含,直接存進去
regionMap.put(region, num);
}
// countMap包含region:將region當(dāng)作key;
if(countMap.containsKey(region)) {
String key2 = region;
String value2 = String.valueOf(countMap.get(key2)); // 從countMap獲取value值;即地域?qū)?yīng)的統(tǒng)計次數(shù)值;
countMap.put(region, Integer.valueOf(value2) + 1);
}
else { // 不包含,直接存進去
countMap.put(region, 1);
}
}
List<String> regionList = new LinkedList<String>(); // 地域
List<String> numberList = new LinkedList<String>(); // 數(shù)值
List<String> regionList2 = new ArrayList<String>(); // 地域2
List<String> countList = new LinkedList<String>(); // 統(tǒng)計次數(shù)
List<String> avgList = new LinkedList<String>(); // 平均值
// 封裝地域集合:(北京,數(shù)值和)
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);
}
// 封裝統(tǒng)計次數(shù)集合:(北京,統(tǒng)計次數(shù))
Iterator<Map.Entry<String, Object>> it2 = countMap.entrySet().iterator();
while(it2.hasNext()){
Map.Entry<String, Object> entry = it2.next();
String key = entry.getKey();
String value = String.valueOf(entry.getValue());
regionList2.add(key);
countList.add(value);
}
// 計算平均值:封裝集合avgList
if(regionList.size() == numberList.size() && regionList2.size() == countList.size() && regionList.size() == regionList2.size()) {
for (int i = 0; i < regionList.size(); i++) {
String reg1 = regionList.get(i);
double fenzi = Double.parseDouble(numberList.get(i));
for (int j = 0; j < regionList2.size(); j++) {
String reg2 = regionList2.get(j);
if(reg1.equals(reg2)) {
int fenmu = Integer.valueOf(countList.get(j));
if(fenmu > 0) {
Double x = fenzi/fenmu;
// double類型的數(shù)據(jù)當(dāng)分母的數(shù)值趨近0的時候,返回來的數(shù)值就是一個NAN:
if(Double.isNaN(x)){
x = 0.0;
}
avgList.add(String.valueOf(x));
}
}
}
}
}
// 最終輸出集合:
List<Map<String,Object>> resultList = new ArrayList<>();
// 根據(jù)地域集合與平均值集合封裝新集合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<>();
// 獲取排序的數(shù)組:
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"));
}
// 數(shù)組排序:
BubblSortUtils.bubbleSortDescMultipleDouble(valueSort,titleSort);
// 數(shù)組封裝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中添加排序字段:sortValue
String[] A = new String[listFinal.size()];
String[] B = new String[listFinal.size()];
for (int i = 0; i < listFinal.size(); i++) {
listFinal.get(i).put("sortValue",listFinal.size()-i);
A[i] = String.valueOf(listFinal.get(i).get("title"));
B[i] = String.valueOf(listFinal.get(i).get("value"));
}
Map<String,Object> restMap = new HashMap<>();
restMap.put("title",A);
restMap.put("value",B);
return restMap;
}
備注:以上代碼可簡化處理,寫這么多是為了明確每個過程,提供數(shù)據(jù)處理的拓展思路;
代碼修改位置:
1.最終返回值由List Map改為數(shù)組返回:
2.修改接口返回值類型:由List Map修改為Map
最后返回值修改如下:文章來源:http://www.zghlxwxcb.cn/news/detail-682032.html
// listFinal中添加排序字段:sortValue
String[] A = new String[listFinal.size()];
String[] B = new String[listFinal.size()];
for (int i = 0; i < listFinal.size(); i++) {
listFinal.get(i).put("sortValue",listFinal.size()-i);
A[i] = String.valueOf(listFinal.get(i).get("title"));
B[i] = String.valueOf(listFinal.get(i).get("value"));
}
Map<String,Object> restMap = new HashMap<>();
restMap.put("title",A);
restMap.put("value",B);
return restMap;
Postman測試:
這樣前端就可以直接獲取使用了,返回的數(shù)組里面也是經(jīng)過排序處理的;文章來源地址http://www.zghlxwxcb.cn/news/detail-682032.html
到了這里,關(guān)于【Java 動態(tài)數(shù)據(jù)統(tǒng)計圖】前后端對接數(shù)據(jù)格式(Map返回數(shù)組格式數(shù)據(jù))六(120)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!