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

需求:

  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.mfbz.cn/a/82703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

气象监测站:用科技感知气象变化

气象监测站是利用科学技术感知当地小气候变化情况的气象观测仪器&#xff0c;可用于农业、林业、养殖业、畜牧业、环境保护、工业等多个领域&#xff0c;提高对环境数据的利用率&#xff0c;促进产业效能不断提升。 气象监测站主要由气象传感器、数据传输系统、电源系统、支架…

VALN-hybrid模式

实验拓扑及要求 一、实验思路 1.R1-R3按要求配置&#xff0c;R2不划分vlan使其全部都可以访问 2.交换机和路由器的交换机直连接口设为hybrid模式且R4-R6不带vlan标签访问路由器 3.交换机和交换机的两个直连接口设为hybrid模式且只允许R4-R6所在vlan标签通过 4.R4-R6只允许其…

三.net core 自动化发布到docker (创建一个dotnet工程发布)

创建Jenkins-create a job 输入名称&#xff08;建议不要带“”这类的字符&#xff09;&#xff0c;选择自由风格的类型&#xff08;红框标注的&#xff09;&#xff0c;点击确定 用于测试,下面选项基本没有选择-配置代码地址 选择执行shell #!/bin/bash # 获取短版本号 GITHA…

网络安全---负载均衡案例

一、首先环境配置 1.上传文件并解压 2.进入目录下 为了方便解释&#xff0c;我们只用两个节点&#xff0c;启动之后&#xff0c;大家可以看到有 3 个容器&#xff08;可想像成有 3 台服务器就成&#xff09;。 二、使用蚁剑去连接 因为两台节点都在相同的位置存在 ant.jsp&…

【算法系列篇】滑动窗口

文章目录 前言什么是滑动窗口1.长度最小的子数组1.1 题目要求1.2 做题思路 1.3 Java代码实现2.无重复字符的最长子串2.1 题目要求2.2 做题思路2.3 Java代码实现 3.最大连续1的个数 III3.1 题目要求3.2 做题思路3.3 Java代码实现 4.将x减到0的最小操作数4.1 题目要求4.2 做题思路…

实验一 ubuntu 网络环境配置

ubuntu 网络环境配置 【实验目的】 掌握 ubuntu 下网络配置的基本方法&#xff0c;能够通过有线网络连通 ubuntu 和开发板 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&#xff0c;以“#”开头的…

CoordAtt注意力网络结构

源码&#xff1a; import torch import torch.nn as nn import math import torch.nn.functional as Fclass h_sigmoid(nn.Module):def __init__(self, inplaceTrue):super(h_sigmoid, self).__init__()self.relu nn.ReLU6(inplaceinplace)def forward(self, x):return self.…

1、攻防世界第一天

1、网站目录下会有一个robots.txt文件&#xff0c;规定爬虫可以/不可以爬取的网站。 2、URL编码细则&#xff1a;URL栏中字符若出现非ASCII字符&#xff0c;则对其进行URL编码&#xff0c;浏览器将该请求发给服务端&#xff1b;服务端会可能会先对收到的url进行解码&#xff0…

设计模式——开闭原则

文章目录 基本介绍看下面一段代码方式 1 的优缺点改进的思路分析 基本介绍 开闭原则&#xff08;Open Closed Principle&#xff09;是编程中最基础、最重要的设计原则 一个软件实体如类&#xff0c;模块和函数应该对扩展开放(对提供方)&#xff0c;对修改关闭(对使用方)。用抽…

CF 1326D Prefix-Suffix Palindrome(最长回文前后缀)

CF 1326D Prefix-Suffix Palindrome(最长回文前后缀) Problem - D2 - Codeforces 大意&#xff1a;给出一个字符串 S &#xff0c; 找出满足以下条件的字符串 T。 1. 字符串 T 尽可能长 并且 |T| ≤ |S| 2.字符串 T 由 S 的一个前缀和后缀拼接而成 &#xff0c; T 是回文串…

情报与GPT技术大幅降低鱼叉攻击成本

邮件鱼叉攻击&#xff08;spear phishing attack&#xff09;是一种高度定制化的网络诈骗手段&#xff0c;攻击者通常假装是受害人所熟知的公司或组织发送电子邮件&#xff0c;以骗取受害人的个人信息或企业机密。 以往邮件鱼叉攻击需要花费较多的时间去采集情报、深入了解受…

【ARM v8】如何在ARM上实现x86的rdtsc()函数

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Laravel 框架构造器的排序分组.子查询 JOIN 查询 构造器的增删改 ⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

文件上传xxx

本地保存文件 将文件保存到服务器本地硬盘中 max-request-size 多个文件总大小不能大于100M PostMapping("/upload")public Result upload(String username,Integer age,MultipartFile image) throws IOException {log.info("用户名:{},牛叔&#xff1a;{},文件…

ARM--day4(电灯实验、分析RCC、GPIO控制器,PMOS管、NMOS管的基本原理)

电灯实验代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/RCC_INIT:1.使能GPIOE组控制器&#xff0c;通过RCC_AHB4ENSETR寄存器设置第&#xff3b;5:4&#xff3d;位写&#xff11;---->0x50000A28[4]1ldr r0,0x50000A28ldr r1,[r0]orr…

H5: div与textarea输入框的交互(聚焦、失去焦点、键盘收起)

简介 本文是基于 VUE3TS 的代码说明。 记录自己遇到的 div 与 textarea 输入框交互的聚焦、失去焦点、键盘收起、表情插入不失去焦点的需求实现。 需求分析 1.固定在页面底部&#xff1b; 2.默认显示纯文字与发送图标按钮&#xff0c;文字超出的省略显示&#xff1b; 3.点击…

无涯教程-Perl - syswrite函数

描述 此函数尝试将SCALAR中的LENGTH个字节写入与FILEHANDLE相关的文件。如果指定了OFFSET,则从提供的SCALAR中的OFFSET字节中读取信息。该函数使用C /操作系统的write()函数,该函数绕过普通缓冲。 语法 以下是此函数的简单语法- syswrite FILEHANDLE, SCALAR, LENGTH, OFFS…

【2023新教程】树莓派定时自动拍照并上传腾讯云对象存储COS

1 换源 仅适用于Release date: May 3rd 2023、Debian version: 11 (bullseye)这个树莓派OS版本&#xff0c;其他版本不保证有效。 首先使用如下命令&#xff0c;查看自己树莓派的架构。 uname -a结果如下&#xff1a; 如果红圈处显示为aarch64&#xff0c;使用命令sudo na…

个性化定制界面 VS 极简版原装界面:你更喜欢哪一个?为什么?

文章目录 每日一句正能量前言自己的喜好使用这种界面的原因这种界面对你的影响后记 每日一句正能量 不管昨天、今天、明天&#xff0c;能豁然开朗就是最美好的一天。 前言 个性化定制界面和极简版原装界面&#xff0c;哪一个你用起来更加顺手呢&#xff0c;相比之下你更喜欢哪一…
最新文章