【Java 动态数据统计图】动态数据统计思路案例(动态,排序)二(113)

news2024/9/25 13:20:41

需求:

  1. 有一个List<Map<String.Object>>,存储了区域的数据,
    数据是根据用户查询条件进行显示的;所以查询的数据是动态的;
  2. 按区域维度统计每个区域出现的次数,并且按照次数的大小排序(升序);
  3. 区域是动态的,有次数则返回;没有则不返回;

分析:
后端给前端返回值:不能用对象返回,因为数据是动态的,key是不固定的;
可以使用:List<Map<String,Object>>返回;Map中key为区域;value为统计次数;

Demo案例:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class day07 {
	public static void main(String[] args) {
		
		List<Map<String,Object>> list = new ArrayList<>();
		Map<String,Object> map9 = new HashMap<>();
		map9.put("region","灞桥区");
		Map<String,Object> map10 = new HashMap<>();
		map10.put("region","灞桥区");
		Map<String,Object> map11 = new HashMap<>();
		map11.put("region","灞桥区");
		Map<String,Object> map12 = new HashMap<>();
		map12.put("region","灞桥区");
		Map<String,Object> map13 = new HashMap<>();
		map13.put("region","灞桥区");
		Map<String,Object> map1 = new HashMap<>();
		map1.put("region","长安区");
		Map<String,Object> map2 = new HashMap<>();
		map2.put("region","雁塔区");
		Map<String,Object> map3 = new HashMap<>();
		map3.put("region","莲湖区");
		Map<String,Object> map4 = new HashMap<>();
		map4.put("region","碑林区");
		Map<String,Object> map5 = new HashMap<>();
		map5.put("region","莲湖区");
		Map<String,Object> map6 = new HashMap<>();
		map6.put("region","未央区");
		Map<String,Object> map7 = new HashMap<>();
		map7.put("region","未央区");
		Map<String,Object> map8 = new HashMap<>();
		map8.put("region","未央区");
		list.add(map9);
		list.add(map10);
		list.add(map11);
		list.add(map12);
		list.add(map13);
		list.add(map1);
		list.add(map2);
		list.add(map3);
		list.add(map4);
		list.add(map5);
		list.add(map6);
		list.add(map7);
		list.add(map8);
		
		List<Map<String,Object>> listResult = new ArrayList<>();
        List<Map<String,Object>> listFinal= new ArrayList<>();
        String[] regionlArr = {"灞桥区","长安区","雁塔区","莲湖区","碑林区","未央区","新城区"};
        int[] arr = new int[regionlArr.length];
        // 数组接收:统计每个区域出现的次数;
        for (int i = 0; i < list.size(); i++) {
            String re = String.valueOf(list.get(i).get("region"));
            for (int j = 0; j < regionlArr.length; j++) {
                if(re.equals(regionlArr[j])){
                    arr[j] = arr[j] + 1;
                }
            }
        }
        // List接收:动态获取数据,过滤掉次数为0的数据;
        for (int i = 0; i < regionlArr.length; i++) {
            Map<String,Object> map = new HashMap<>();
            String title = regionlArr[i];
            int value = arr[i];
            if(!String.valueOf(value).equals("0")){
                map.put("title",title);
                map.put("value",value);
                listResult.add(map);
            }
        }
        System.out.println("动态获取匹配后的数据:"+listResult);
        int[] valueSort = new int[listResult.size()];
        String[] regionSort = new String[listResult.size()];
        
        // 获取次数用于排序
        for (int i = 0; i < listResult.size(); i++) {
            valueSort[i] = Integer.valueOf(String.valueOf(listResult.get(i).get("value")));
            regionSort[i] = String.valueOf(listResult.get(i).get("title"));
        }

        // 根据次数排序 
        bubbleSortAsc(valueSort,regionSort); 

        // 根据排序返回数据
        for (int i = 0; i < regionSort.length; i++) {
        	String ch = String.valueOf(regionSort[i]);
            for (int j = 0; j < listResult.size(); j++) {
                String value = String.valueOf(listResult.get(j).get("title"));
                if(ch.equals(value)){
                    listFinal.add(listResult.get(j));
                }
            }
        }
        System.out.println("最终输出数据:"+listFinal);         
	}
	for (int i = 0; i < listFinal.size(); i++) {
        listFinal.get(i).put("sortValue",i+1);
    }
	
	/*
     * Int类型:冒泡排序(升序)
     *
     */
    public static void bubbleSortAsc(int[] arr,String[]arr2) {
	    int temp;  // 定义一个临时变量
	    String temp2;  // 定义一个临时变量
	    for(int i=0;i<arr.length-1;i++){  // 冒泡趟数
	        for(int j=0;j<arr.length-i-1;j++){
	            if(arr[j+1]<arr[j]){
	                temp = arr[j];
	                arr[j] = arr[j+1];
	                arr[j+1] = temp;
	                
	                temp2 = arr2[j];
	                arr2[j] = arr2[j+1];
	                arr2[j+1] = temp2;
	            }
	        }
	    }
	} 
    
}

测试输出:

动态获取匹配后的数据:
[{title=灞桥区, value=5}, {title=长安区, value=1}, {title=雁塔区, value=1}, {title=莲湖区, value=2}, {title=碑林区, value=1}, {title=未央区, value=3}]

最终输出数据:
[{sortValue=1, title=长安区, value=1}, {sortValue=2, title=雁塔区, value=1}, {sortValue=3, title=碑林区, value=1}, {sortValue=4, title=莲湖区, value=2}, {sortValue=5, title=未央区, value=3}, {sortValue=6, title=灞桥区, value=5}]

案例二:
需求:前端根据后端的返回数据:画统计图;

X轴是动态的,有对应区域数据则展示;
X轴 区域数据降序排序;
在这里插入图片描述
代码逻辑:


	// Service  
	List<Map<String,Object>> getRegionData(HttpServletRequest request,Map<String, Object> paramMap);
	// ServiceImpl  
	@Override
    public List<Map<String,Object>> getRegionData(HttpServletRequest request, Map<String, Object> paramMap) {
         List<Map<String,Object>> list = getCountData(request,paramMap); // 封装统计查询的数据(与数据库交互)
        List<Map<String,Object>> listResult = new ArrayList<>();
        List<Map<String,Object>> listFinal= new ArrayList<>();
        String[] problemRevealArr = {"长安区","雁塔区","灞桥区","莲湖区","未央区"};
        int[] arr = new int[problemRevealArr.length];
        for (int i = 0; i < list.size(); i++) {
            String problemReveal = String.valueOf(list.get(i).get("waysOfProblemReveal"));
            for (int j = 0; j < problemRevealArr.length; j++) {
                if(problemReveal.equals(problemRevealArr[j])){
                    arr[j] = arr[j] + 1;
                }
            }
        }
        for (int i = 0; i < problemRevealArr.length; i++) {
            Map<String,Object> map = new HashMap<>();
            String title = problemRevealArr[i];
            int value = arr[i];
            if(!String.valueOf(value).equals("0")){
                map.put("title",title);
                map.put("value",value);
                listResult.add(map);
            }
        }
        int[] valueSort = new int[listResult.size()];
        String[] titleSort = new String[listResult.size()];
        for (int i = 0; i < listResult.size(); i++) {
            valueSort[i] = Integer.valueOf(String.valueOf(listResult.get(i).get("value")));
            titleSort[i] = String.valueOf(listResult.get(i).get("title"));
        }
        BubbleSort(valueSort,titleSort);
        for (int i = 0; i < valueSort.length; i++) {
            String ch = String.valueOf(titleSort[i]);
            for (int j = 0; j < listResult.size(); j++) {
                String value = String.valueOf(listResult.get(j).get("title"));
                if(ch.equals(value)){
                    listFinal.add(listResult.get(j));
                }
            }
        }
        return listFinal;
    }
	
	/*
     * 冒泡排序(降序)
     *
     */
    public static void BubbleSort(int[] arr,String[]arr2) {
        int temp;
        String temp2;
        for (int i=0;i<arr.length;i++) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[i] >= arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;

                    temp2 = arr2[i];
                    arr2[i] = arr2[j];
                    arr2[j] = temp2;
                }
            }
        }
    }

Postman接口测试:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/889983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++新经典--文件操作

文件简介 文件在程序设计中是一个比较重要的概念&#xff0c;这里所说的文件&#xff0c;是指保存在硬盘、U盘等存储介质上的数据&#xff0c;这些存储介质&#xff08;简称磁盘&#xff09;上的数据就是以一个个文件的形式体现&#xff0c;每一个文件有一个对应的名字&#x…

Kotlin开发笔记:使用委托进行拓展

Kotlin开发笔记&#xff1a;使用委托进行拓展 导言 在OO语言(面向对象)中&#xff0c;我们经常会用到委托或者代理的思想。委托和代理在乍一看很相似&#xff0c;其实其各有各的侧重点&#xff0c;这里我引用ChatGpt的回答&#xff1a; 委托&#xff08;Delegation&#xff09…

内涝防控一张图!解锁内涝防控全周期解决方案

随着暴雨高发季的到来&#xff0c;如何提升城市内涝治理水平&#xff0c;构筑人民生活美好空间成为各地关注的重点。近日&#xff0c; 住房和城乡建设部、应急管理部印发《关于加强城市排水防涝应急管理工作的通知》&#xff0c;明确提出&#xff0c;各地要加强城市内涝整治和排…

java Spring Boot properties多环境配置拆分文件管理

上文 java Spring Boot yml多环境拆分文件管理优化 我们用yml 做了一个多环境配置文件的拆分管理 我们将 application.yml 改为 application.properties 参考代码如下 spring.profiles.activedev我们知道 yml 是用 : 来区分高低基本 而 properties是直接通过 . 来表达 其他基本…

解锁暑假云端生活:铁威马NAS助你打造个性化体验

暑假转眼过半&#xff0c;大家一定度过一段非常美好的时光吧。朋友圈被去各地旅游的、看各种演唱会的、各种各样的观影读后感刷屏...生活很精彩&#xff0c;但如何高效地管理、享受和分享自己的文件、照片和影音内容成为困扰我们的难题。在这方面&#xff0c;铁威马NAS成为了越…

Unity自定义脚本的 初始模版

参考博主&#xff1a;Unity修改创建的脚本模板&#xff0c;Unity脚本模板路径_unity hub 怎么改脚本模板_先生沉默先的博客-CSDN博客 【100个 Unity实用技能】 ☀️ | Unity自定义脚本的初始模版_unity 模板脚本_呆呆敲代码的小Y的博客-CSDN博客 一&#xff0c;将脚本放到Ed…

【uniapp】使用permission获取录音权限及实现录音功能

需求 app获取录音权限权限, 实现录音并且播放功能 实现 一. 使用permission获取录音权限 原博 : https://www.wanjunshijie.com/note/uniapp/3203.html 1.1 manifest.json 配置权限 android.permission.RECORD_AUDIO 1.2 permision使用和下载 ( 自行百度搜索即可 ) 1.3 获…

【探索Linux】—— 强大的命令行工具 P.4(编译器 gcc/g++ 使用)

阅读导航 前言一、编译的四大过程&#xff08;背景知识&#xff09;1. 预处理&#xff08;Preprocessing&#xff09;2. 编译&#xff08;Compilation&#xff09;3. 汇编&#xff08;Assembly&#xff09;4. 链接&#xff08;Linking&#xff09; 二、gcc的使用1. 概念2. gcc主…

Docker 容器内无法使用vim命令 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 进入Docker容器后 无法使用vim编辑器,出现如下问题:bash: vim: command not found 如图所示: 想着通过apt-get 安装vim,出现如下问题: root@b9f0fd330d5b:/# apt-get install vim Reading package lists... Done B…

VR全景加盟项目如何开展?如何共赢VR时代红利?

VR全景作为一个新兴蓝海项目&#xff0c;相信有着很多人刚接触VR行业的时候都会有这样的疑问&#xff1a;VR全景加盟后项目如何开展&#xff1f;今天&#xff0c;我们就从项目运营的三个阶段为大家讲解。 一、了解项目时 目前VR全景已经被应用到各行各业中去&#xff0c;学校、…

通过postgresql的Ltree字段类型实现目录结构的基本操作

通过postgresql的Ltree字段类型实现目录结构的基本操作 将这种具有目录结构的excel表存储到数据库中&#xff0c;可以采用树型结构存储 DROP TABLE IF EXISTS "public"."directory_tree"; CREATE TABLE "public"."directory_tree" (…

使用 PyTorch 进行高效图像分割:第 1 部分

一、说明 在这个由 4 部分组成的系列中&#xff0c;我们将使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。我们将在本文中从图像分割所需的基本概念和想法开始本系列。 图1&#xff1a;宠物图像及其分割掩码&#xff08;来源&#xff1a;牛津-IIIT宠物数据集) 图像分…

OpenLayers入门,OpenLayers加载船讯网航海地图

专栏目录: OpenLayers入门教程汇总目录 前言 本章实现OpenLayers加载船讯网航海地图。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中如何使用: vue项目使用请参考这篇文章:

Maven之JDK编译问题

IDEA Maven 默认使用 JDK 1.5 编译问题 IDEA 在「调用」maven 时&#xff0c;IDEA 默认都会采用 JDK 1.5 编译&#xff0c;不管你安装的 JDK 版本是 JDK 7 还是 JDK 8 或者更高。这样一来非常不方便&#xff0c;尤其是时不时使用 JDK 7/8 的新特性时。如果使用新特性&#xff…

[10min速通]STM32CubemMX配置W25Q128

[10min速通]&#x1f98f;STM32CubemMX配置W25Q128 文章目录 [10min速通]&#x1f98f;STM32CubemMX配置W25Q1281、下载源码2、配置Cube2.1 基础配置2.2 SPI配置 3、配置MDK3.1 添加源文件3.2 管理源文件3.3 完成接口配置 4、接口介绍4.1 初始化4.2 擦除4.3 写入4.4 读取 5、代…

AntDB数据库受邀参加【ACDU 中国行】,共促行业发展和创新

作为数据的集中存储和管理系统&#xff0c;数据库在现代信息化时代扮演着至关重要的角色&#xff0c;随着人工智能&#xff0c;物联网和大数据时代的到来&#xff0c;数据库的发展需要进一步拓展其广度和深度&#xff0c;持续创新&#xff0c;实现技术进步&#xff0c;以更好地…

香港服务器备案会通过吗?

​  对于企业或个人来说&#xff0c;合规备案是网络运营的基本要求&#xff0c;也是保护自身权益的重要举措。以下内容围绕备案展开话题&#xff0c;希望为您解开疑惑。 香港服务器备案会通过吗? 目前&#xff0c;香港服务器无法备案&#xff0c;这是由于国内管理规定的限制…

Salient主题 - 创意多用途和WooCommerce商城主题

Salient主题是下一代WordPress主题&#xff0c;给任何人带来专业的设计结果&#xff0c;而不需要任何编码。Salient 提供永久更新的专业剖面模板库&#xff0c;目前有超过425个可供选择 – 所有这些都充满热情并坚持高标准的审美质量。 网址: Salient主题 - 创意多用途和WooCo…

Linux下安装nodejs

1、下载nodejs 点击前往&#xff1a;Download | Node.js 2、解压 tar -xvf node-v18.16.0-linux-x64.tar.xz mv node-v18.16.0-linux-x64/ /usr/local/nodejs 3、 建立软链接 此时的bin文件夹中已经存在node以及npm&#xff0c;如果你进入到对应文件的中执行命令行一点问题…

vue3 路由缓存问题

目录 解决问题的思路&#xff1a; 解决问题的方案&#xff1a; 1、给roter-view添加key&#xff08;破坏复用机制&#xff0c;强制销毁重建&#xff09; 2、使用beforeRouteUpdate导航钩子 3、使用watch监听路由 vue3路由缓存&#xff1a;当用户从/users/johnny导航到/use…