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

news2025/3/1 21:26:43

需求:

  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/895258.html

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

相关文章

在线零售供应链管理:从0到100

全球57%的公司将其供应链视为竞争优势&#xff0c;然而只有6%的人表示完全了解它。无论您是首次在线卖家还是经验丰富的专业人士&#xff0c;驾驭管理高效且具有成本效益的零售供应链的复杂性都可能具有挑战性。一起来了解一下吧&#xff01; 供应链管理是什么&#xff1f;它基…

【LeetCode75】第三十一题 反转链表

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 最经典的链表题&#xff0c;没有之一&#xff01;&#xff01;&#xff01; 强烈建议直接把模板记住&#xff01;&#xff01;&#xf…

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有&#xff1a;FairyGUI&#xff0c;VSCode 代码环境涉及到了&#xff1a;Lua VSCode插件&#xff1a;EmmyLua 在编写FairyGUI编辑器菜单前&#xff0c;了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能…

sed 语法和基础命令

1. 准备工作 准备备一个数据文件data.txt&#xff0c;内容如下&#xff1a; 101,Zhang san,Fu Jian 102,Li si,Shan Dong 103,Wang Wu,Bei Jing 104,Zhao Qian Sun,Zhe Jiang 105,Ge Lin,Shang Hai 每一行为一条数据&#xff0c;每条数据包含三个元素&#xff1a;ID&#xf…

薪资涨幅1000%+,转行学Java后,他彻底开挂了

以下为学长故事的文字版&#xff1a; 哈喽黑马程序员的学员们大家好&#xff0c;我是17级毕业的学长陈同学&#xff0c;很高兴和大家分享我的转行故事。 来黑马前后的变化 我刚毕业是去了浙江的一个电力公司&#xff0c;做电器的一个项目&#xff0c;这个项目一共工作了半年…

PIN TO PIN替代LT8911EXB|CS5523低成本替代LT8911EXB|MIP DSI转DP EDP方案设计

PIN TO PIN替代LT8911EXB|CS5523低成本替代LT8911EXB|MIP DSI转DP EDP方案设计 LT8911EXB是MIPI DSI/CSI 转eDP转换芯片&#xff0c;ASL CS5523不需要改电路就可以直接PIN TO PIN替代与兼容LT8911EXB。 ASL CS5523与 LT8911EXB的功能与参数&#xff0c;用途方式以及封装方式和…

《TCP IP网络编程》第十八章

第 18 章 多线程服务器端的实现 18.1 理解线程的概念 线程背景&#xff1a; 第 10 章介绍了多进程服务端的实现方法。多进程模型与 select 和 epoll 相比的确有自身的优点&#xff0c;但同时也有问题。如前所述&#xff0c;创建&#xff08;复制&#xff09;进程的工作本身会…

[Docker精进篇] Docker镜像构建和实践 (三)

前言&#xff1a; Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中&#xff0c;以便在不同环境中快速、可靠地部署和运行应用程序。 文章目录 Docker镜像构建1️⃣是什么&#xff1f;2️⃣为什么&#xff1f;3️⃣镜像构建一、用现有容器构建新镜像…

构建可远程访问的企业内部论坛

文章目录 前言1.cpolar、PHPStudy2.Discuz3.打开PHPStudy&#xff0c;安装网页论坛所需软件4.进行网页运行环境的构建5.运行Discuz网页程序6.使用cpolar建立穿透内网的数据隧道&#xff0c;发布到公网7.对云端保留的空白数据隧道进行配置8.Discuz论坛搭建完毕 前言 企业在发展…

Python科研绘图--Task01

目录 科研论文配图主要成分 常见的插图格式 像素图 矢量图 色彩模式 RGB色彩模式 CMYK色彩模式 HEX色彩模式 色轮配色原理 单色配色方案 例子 互补色配色方案 例子 等距三角配色方案 例子 四角配色方案 例子 颜色主题 单色系 例子 双色渐变色系 例子 多色…

直线导轨的选购要素

直线导轨是用来支撑和引导运动部件&#xff0c;按给定的方向做往复直线运动&#xff0c;主要用于精密机床、坐标测量机和大型机床&#xff0c;对于我们整个国民生产、生活活动都起着至关重要的作用。 我们在选购直线导轨时&#xff0c;都想要选到质量好的&#xff0c;那么我们要…

【JavaEE基础学习打卡05】JDBC之基本入门就可以了

目录 前言一、JDBC学习前说明1.Java SE中JDBC2.JDBC版本 二、JDBC基本概念1.JDBC原理2.JDBC组件 三、JDBC基本编程步骤1.JDBC操作的数据库准备2.JDBC操作数据库表步骤 四、代码优化1.简单优化2.with-resources探讨 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好…

Spring框架之揭秘Bean的生命周期与单例详解【面试题超详细回答】

目录 一、前言 1.1.介绍Spring框架和Bean的概念 二、Bean的实例化阶段 2.1.Bean的实例化过程 2.2.介绍默认构造函数和工厂方法的使用 三、Bean的初始化阶段 3.1.InitializingBean接口和PostConstruct注解的使用 3.2.Bean的初始化方法配置和执行顺序 四、Bean的销毁阶段…

数据库变革:HashData云数仓实现事务级实时性

8月16-18日&#xff0c;第十四届中国数据库技术大会&#xff08;DTCC 2023&#xff09;在北京召开。酷克数据资深解决方案架构师陈义贤在“数据库内核•技术创新”专场发表题为“分布式数仓的TP能力探索—HashData UnionStore”的演讲&#xff0c;介绍HashData以Log is databas…

QT的mysql(数据库)最佳实践和常见问题解答

涉及到数据库&#xff0c;首先安利一个软件Navicat Premium&#xff0c;用来查询数据库很方便 QMysql驱动是Qt SQL模块使用的插件&#xff0c;用于与MySQL数据库进行通信。要编译QMysql驱动&#xff0c;您需要满足以下条件&#xff1a; 您需要安装MySQL的客户端库和开发头文件…

三生ONE物,无限可能|博睿数据上市三周年!

2020年8月17日&#xff0c;北京博睿宏远数据科技股份有限公司作为国内A股市场上的“APM应用性能监控第一股”公司&#xff0c;在科创板荣登上市&#xff01;&#xff08;股票号688229&#xff09; 2023年8月17日&#xff0c;三载日夜更替&#xff0c;博睿一路砥砺前行&#xf…

Eclipse集成MapStruct

Eclipse集成MapStruct 在Eclipse中添加MapStruct依赖配置Eclipse支持MapStruct①安装 m2e-aptEclipse Marketplace的方式安装Install new software的方式安装&#xff08;JDK8用到&#xff09; ②添加到pom.xml 今天拿到同事其他项目的源码&#xff0c;导入并运行的时候抛出了异…

Channel是什么?FileChannel类的常用方法

Channel 是一个接口对象,它类似于传统的流对象,但与传统的流对象又有些不同&#xff0c;具体表现如下: • Channel可以异步地执行I/O读写操作。 • Channel的读写操作是双向的,既可以从 Channel中读取数据,又可以写数据到Channel,而流的读写操作通常都是单向的。 • Channel…

Can‘t find end of central directory : is this a zip file ? at XMLHttpRequest

导出woed出现这个报错,原因其实很简单,路径写错了, 这个word首先必须是docx格式,然后必须放在public文件包下 如果放在public文件包下还没有用,则放在public包下 参考帖子: https://www.cnblogs.com/hejun26/p/13647927.html

VR漫游:720度实景参观,打造魅力生态小区

随着城市的不断发展&#xff0c;小区的建设越发具有生态化、绿色化的特点&#xff0c;人们也会偏向选择更加适合居住的小区。为了让更多的用户体验小区的舒适性&#xff0c;不少地产开发商准备引入VR漫游技术。 VR漫游不仅能够真实地展示现场环境&#xff0c;还可以改变传统网络…