【Java 动态数据统计图】动态X轴二级数据统计图思路Demo(动态,排序,动态数组(重点推荐:难)九(131)

需求

1.有一组数据集合,数据集合中的数据为动态;
举例如下:
[{province=陕西省, city=西安市}, {province=陕西省, city=咸阳市}, {province=陕西省, city=宝鸡市}, {province=陕西省, city=延安市}, {province=陕西省, city=汉中市}, {province=四川省, city=成都市}, {province=四川省, city=成都市}, {province=四川省, city=广元市}, {province=四川省, city=绵阳市}, {province=陕西省, city=西安市}, {province=陕西省, city=西安市}, {province=陕西省, city=宝鸡市}, {province=江苏省, city=南京市}, {province=江苏省, city=南京市}, {province=江苏省, city=扬州市}, {province=河北省, city=石家庄市}, {province=山东省, city=济南市}, {province=山东省, city=青岛市}, {province=山东省, city=烟台市}, {province=山东省, city=潍坊市}]
2.通过计算得出统计的数据;省按照大小排序,动态展示,城市按照大小排序,动态展示;

最终绘制如下
在这里插入图片描述

备注:以下看到的函数名称大多是自定义封装的。

当前案例代码中需要用到的知识技能:

1.Set集合去重:Set hashSet = new HashSet<>();
2.Set集合转数组:String[] provinceArr = hashSet.toArray(new String[hashSet.size()]);
3.一维双数组排序:BubblSortUtils.bubbleSortDescMultiple(provinceSort,provinceArr);
4.创建集合数组(数组里面的元素为set集合):Set[] setArr = new Set[provinceArr.length];
5.创建二维数组(set集合数组转二维数组):String[][] stringArr = new String[provinceArr.length][];
6.二维数组,双数组根据第二维度排序:BubblSortUtils.bubbleSortDescMultiple2(countArr,stringArr);
7.String,Int数组间的互相转化;
8.百分比计算函数封装;
9.一维数组和二维数组组合:计算一维数组在二维中的中间位置;
10.返回数据封装:二维数组转一维数组;

Demo案例:代码逻辑比较复杂,需耐心看!

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;public class day24 {public static void main(String[] args) {List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map1 = new HashMap<>();map1.put("province","陕西省");map1.put("city","西安市");Map<String,Object> map2 = new HashMap<>();map2.put("province","陕西省");map2.put("city","咸阳市");Map<String,Object> map3 = new HashMap<>();map3.put("province","陕西省");map3.put("city","宝鸡市");Map<String,Object> map4 = new HashMap<>();map4.put("province","陕西省");map4.put("city","延安市");Map<String,Object> map5 = new HashMap<>();map5.put("province","陕西省");map5.put("city","汉中市");Map<String,Object> map6 = new HashMap<>();map6.put("province","四川省");map6.put("city","成都市");Map<String,Object> map7 = new HashMap<>();map7.put("province","四川省");map7.put("city","成都市");Map<String,Object> map8 = new HashMap<>();map8.put("province","四川省");map8.put("city","广元市");Map<String,Object> map9 = new HashMap<>();map9.put("province","四川省");map9.put("city","绵阳市");Map<String,Object> map10 = new HashMap<>();map10.put("province","陕西省");map10.put("city","西安市");Map<String,Object> map11 = new HashMap<>();map11.put("province","陕西省");map11.put("city","西安市");Map<String,Object> map12 = new HashMap<>();map12.put("province","陕西省");map12.put("city","宝鸡市");Map<String,Object> map13 = new HashMap<>();map13.put("province","江苏省");map13.put("city","南京市");Map<String,Object> map14 = new HashMap<>();map14.put("province","江苏省");map14.put("city","南京市");Map<String,Object> map15 = new HashMap<>();map15.put("province","江苏省");map15.put("city","扬州市");Map<String,Object> map16 = new HashMap<>();map16.put("province","河北省");map16.put("city","石家庄市");Map<String,Object> map17 = new HashMap<>();map17.put("province","山东省");map17.put("city","济南市");Map<String,Object> map18 = new HashMap<>();map18.put("province","山东省");map18.put("city","青岛市");Map<String,Object> map19 = new HashMap<>();map19.put("province","山东省");map19.put("city","烟台市");Map<String,Object> map20 = new HashMap<>();map20.put("province","山东省");map20.put("city","潍坊市");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.add(map9);list.add(map10);list.add(map11);list.add(map12);list.add(map13);list.add(map14);list.add(map15);list.add(map16);list.add(map17);list.add(map18);list.add(map19);list.add(map20);System.out.println("入参数据:"+list);// 一:获取一级维度:// 创建Set集合:获取一级维度数据的数据集:去重Set<String> hashSet = new HashSet<>();for (int i = 0; i < list.size(); i++) {String province = String.valueOf(list.get(i).get("province"));hashSet.add(province);}// 创建一级维度省份数组:String[] provinceArr = new String[hashSet.size()];// 创建一级维度省份数量数组:int[] provinceSort = new int[hashSet.size()];// Set转数组if(list.size() > 0){provinceArr = hashSet.toArray(new String[hashSet.size()]);}// 根据一级维度省份数组:计算一级维度省份数量数组;for (int i = 0; i < provinceArr.length; i++) {for (int j = 0; j < list.size(); j++) {if(provinceArr[i].equals(String.valueOf(list.get(j).get("province")))){provinceSort[i] = provinceSort[i] + 1;}}}// 排序:一级维度省份数组;BubblSortUtils.bubbleSortDescMultiple(provinceSort,provinceArr); // 封装集合测试输出:System.out.println("--------------------");List<Map<String,Object>> listFinal= new ArrayList<>();for (int i = 0; i < provinceArr.length; i++) {Map<String,Object> map = new HashMap<>();map.put("title",provinceArr[i]);map.put("value",provinceSort[i]);listFinal.add(map);}System.out.println("一级维度省份类型和数量:"+listFinal);// 二:获取二级维度:// 创建集合数组(数组里面的元素为set集合)Set[] setArr = new Set[provinceArr.length];// 创建二维数组(set集合数组转二维数组)String[][] stringArr = new String[provinceArr.length][];// 集合数组:获取二级维度城市类型数据的数据集:去重for (int i = 0; i < provinceArr.length; i++) {Set<String> hashSet2 = new HashSet<>();// 获取城市数组;for (int j = 0; j < list.size(); j++) {if(provinceArr[i].equals(String.valueOf(list.get(j).get("province")))){hashSet2.add(String.valueOf(list.get(j).get("city")));}}setArr[i] = hashSet2;}// 二维数组:set集合城市数组转二维城市数组;for (int i = 0; i < setArr.length; i++) {Set<String> hashSet2 = setArr[i];String[] provinceArr2 = new String[hashSet2.size()];if(list.size() > 0){provinceArr2 = hashSet2.toArray(new String[hashSet2.size()]);}stringArr[i] = provinceArr2;}// 创建城市数量二维数组;String[][] countArr = new String[provinceArr.length][];// 二维数组:根据二维城市类型数组计算:二维城市数量数组;for (int i = 0; i < stringArr.length; i++) {String [] s = stringArr[i];String[] temp = new String[s.length];for (int j = 0; j < s.length; j++) {for (int k = 0; k < list.size(); k++) {if(s[j].equals(String.valueOf(list.get(k).get("city")))) {if(String.valueOf(temp[j]).equals("null")) {temp[j] = "1";}else {temp[j] = String.valueOf(Integer.valueOf(temp[j]) + 1);}}}}countArr[i] = temp;}// 数组排序:城市数组和数量数组排序;BubblSortUtils.bubbleSortDescMultiple2(countArr,stringArr);// 三:百分比二维数组:计算百分比String[][] percentageArr = new String[provinceArr.length][];int sum = list.size();for (int i = 0; i < countArr.length; i++) {String [] s = countArr[i];String[] temp = new String[s.length];for (int j = 0; j < s.length; j++) {if(list.size() > 0) {temp[j] = percentageConversion(Integer.valueOf(s[j]),sum);}}percentageArr[i] = temp;}System.out.println("------------------:");// 四:数据封装返回:/** 分析:当前得到了四个数组;* 一维数组:provinceArr* 二维数组:stringArr,countArr,percentageArr* * 需要将一维数组:provinceArr也转成二维数组并且将数据放在中间位置;* */// 将省份添加到每个二维城市数组的末位;用临时二维数组stringArrTemp接收;String[][] stringArrTemp = new String[provinceArr.length][];for (int i = 0; i < stringArr.length; i++) {String[] s = stringArr[i];String[] temp = new String[s.length+1];for (int j = 0; j < s.length; j++) {temp[j] = s[j];temp[s.length] = provinceArr[i];}stringArrTemp[i] = temp;}// 计算一维数组在二维中的中间位置;        String[][] provinceNewArr = new String[provinceArr.length][];for (int i = 0; i < stringArrTemp.length; i++) {String[] s = stringArrTemp[i];String[] temp = new String[s.length-1];int num = s.length-1;for (int j = 0; j < s.length-1; j++) {if(j == num/2) {  // 找数组中间位置if(num % 2 ==0) {  // 中间位置为偶数if(j>0) {  // 首位判断>0temp[j-1] = s[s.length-1];  // 数据向左偏temp[j] = "#";  // 数据左偏完后下个数据需修正;}}else {  // 中间位置为奇数temp[j] = s[s.length-1];}}else {temp[j] = "#";}}provinceNewArr[i] = temp;}// 返回方式一:// 最终得到四个二维数组:provinceNewArr,stringArr,countArr,percentageArr// 二维数组封装Map返回;Map<String,Object> mapResult1 = new HashMap<>();mapResult1.put("province", provinceNewArr);mapResult1.put("cityType", stringArr);mapResult1.put("cityCount", countArr);mapResult1.put("cityPercentage", percentageArr);System.out.println("返回方式一:最终MAP"+mapResult1);// 最终:测试输出:for (int i = 0; i < stringArr.length; i++) {System.out.println(i+":"+stringArr[i]);String[] s1 = stringArr[i];String[] s2 = countArr[i];String[] s3 = percentageArr[i];String[] s4 = provinceNewArr[i];for (int j = 0; j < s1.length; j++) {System.out.println("二级维度城市类型和数量:"+s1[j]+"--"+s2[j]+"--"+s3[j]+"--"+s4[j]);}}// 返回方式二:// 前端要求:所有的数据把二维数组拼接成一维数组返回;List<String> listArr1 = new ArrayList<>();List<String> listArr2 = new ArrayList<>();List<String> listArr3 = new ArrayList<>();List<String> listArr4 = new ArrayList<>();for (int i = 0; i < provinceNewArr.length; i++) {String[] s1 = provinceNewArr[i];String[] s2 = stringArr[i];String[] s3 = countArr[i];String[] s4 = percentageArr[i];for (int j = 0; j < s1.length; j++) {listArr1.add(s1[j]);listArr2.add(s2[j]);listArr3.add(s3[j]);listArr4.add(s4[j]);}}String[] provinceNewArr2 = new String[listArr1.size()];String[] stringArr2 = new String[listArr2.size()];String[] countArr2 = new String[listArr3.size()];String[] percentageArr2 = new String[listArr4.size()];for (int i = 0; i < listArr1.size(); i++) {provinceNewArr2[i] = listArr1.get(i);stringArr2[i] = listArr2.get(i);countArr2[i] = listArr3.get(i);percentageArr2[i] = listArr4.get(i);}Map<String,Object> mapResult2 = new HashMap<>();mapResult2.put("province", provinceNewArr2);mapResult2.put("cityType", stringArr2);mapResult2.put("cityCount", countArr2);mapResult2.put("cityPercentage", percentageArr2);System.out.println("返回方式二:最终MAP"+mapResult2);}public static String percentageConversion(long divisor, long dividend) {String percentage = "";// 接受百分比的值double y = divisor * 1.0;double z = dividend * 1.0;if (y == 0 || z == 0) {return "0.00%";}double result = y / z;DecimalFormat decimalFormat = new DecimalFormat("##.00%"); // ##.00%percentage = decimalFormat.format(result);// ##.00% 使用这种转换方式,整数位如果是0 则会被删除  即0.35% 会出现 .35%的情况char c = percentage.charAt(0);if (String.valueOf(c).equals(".")) {StringBuffer sb = new StringBuffer();sb.append("0").append(percentage);return String.valueOf(sb);}return percentage;}
}

测试输出

入参数据:[{province=陕西省, city=西安市}, {province=陕西省, city=咸阳市}, {province=陕西省, city=宝鸡市}, {province=陕西省, city=延安市}, {province=陕西省, city=汉中市}, {province=四川省, city=成都市}, {province=四川省, city=成都市}, {province=四川省, city=广元市}, {province=四川省, city=绵阳市}, {province=陕西省, city=西安市}, {province=陕西省, city=西安市}, {province=陕西省, city=宝鸡市}, {province=江苏省, city=南京市}, {province=江苏省, city=南京市}, {province=江苏省, city=扬州市}, {province=河北省, city=石家庄市}, {province=山东省, city=济南市}, {province=山东省, city=青岛市}, {province=山东省, city=烟台市}, {province=山东省, city=潍坊市}]
--------------------
一级维度省份类型和数量:[{title=陕西省, value=8}, {title=四川省, value=4}, {title=山东省, value=4}, {title=江苏省, value=3}, {title=河北省, value=1}]
------------------:
返回方式一:最终MAP{cityType=[[Ljava.lang.String;@506e6d5e, province=[[Ljava.lang.String;@96532d6, cityCount=[[Ljava.lang.String;@3796751b, cityPercentage=[[Ljava.lang.String;@67b64c45}
0:[Ljava.lang.String;@4411d970
二级维度城市类型和数量:西安市--3--15.00%--#
二级维度城市类型和数量:宝鸡市--2--10.00%--#
二级维度城市类型和数量:延安市--1--5.00%--陕西省
二级维度城市类型和数量:咸阳市--1--5.00%--#
二级维度城市类型和数量:汉中市--1--5.00%--#
1:[Ljava.lang.String;@6442b0a6
二级维度城市类型和数量:成都市--2--10.00%--#
二级维度城市类型和数量:绵阳市--1--5.00%--四川省
二级维度城市类型和数量:广元市--1--5.00%--#
2:[Ljava.lang.String;@60f82f98
二级维度城市类型和数量:青岛市--1--5.00%--#
二级维度城市类型和数量:济南市--1--5.00%--山东省
二级维度城市类型和数量:烟台市--1--5.00%--#
二级维度城市类型和数量:潍坊市--1--5.00%--#
3:[Ljava.lang.String;@35f983a6
二级维度城市类型和数量:南京市--2--10.00%--江苏省
二级维度城市类型和数量:扬州市--1--5.00%--#
4:[Ljava.lang.String;@7f690630
二级维度城市类型和数量:石家庄市--1--5.00%--河北省
返回方式二:最终MAP{cityType=[Ljava.lang.String;@edf4efb, province=[Ljava.lang.String;@2f7a2457, cityCount=[Ljava.lang.String;@566776ad, cityPercentage=[Ljava.lang.String;@6108b2d7}

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

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

相关文章

【网络安全带你练爬虫-100练】第19练:使用python打开exe文件

目录 一、目标1&#xff1a;调用exe文件 二、目标2&#xff1a;调用exe打开文件 一、目标1&#xff1a;调用exe文件 1、subprocess 模块允许在 Python 中启动一个新的进程&#xff0c;并与其进行交互 2、subprocess.run() 函数来启动exe文件 3、subprocess.run(["文件路…

企业应用系统 PHP项目支持管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 项目支持管理系统是一套完善的web设计系统 应用于企业项目管理&#xff0c;从企业内部的各个业务环境总体掌握&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php项目支撑管理系统2 二、功能介绍 (1)权限管理&#xff1…

手写RPC——数据序列化工具protobuf

手写RPC——数据序列化工具protobuf Protocol Buffers&#xff08;protobuf&#xff09;是一种用于结构化数据序列化的开源库和协议。下面是 protobuf 的一些优点和缺点&#xff1a; 优点&#xff1a; 高效的序列化和反序列化&#xff1a;protobuf 使用二进制编码&#xff0c…

力扣:随即指针138. 复制带随机指针的链表

复制带随机指针的链表 OJ链接 分析&#xff1a; 该题的大致题意就是有一个带随机指针的链表&#xff0c;复制这个链表但是不能指向原链表的节点&#xff0c;所以每一个节点都要复制一遍 大神思路&#xff1a; ps:我是学来的 上代码&#xff1a; struct Node* copyRandomList(s…

TuyaOS开发学习笔记(1)——NB-IoT开发搭建环境、编译烧写(MT2625)

一、搭建环境 1.1 官方资料 TuyaOS 1.2 安装VMware 官网下载&#xff1a;https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0 百度网盘&#xff1a;https://pan.baidu.com/s/1oN7H81GV0g6cD9zsydg6vg 提取…

Android 中SettingsActivity(PreferenceFragmentCompat)的简单使用

如果你需要一个简单的APP设置&#xff0c;可以使用sharedPreferences进行存储&#xff0c;我们可以借助AndroidStudio快速创建一个用于设置的Activity&#xff0c;其实它是继承PreferenceFragmentCompat&#xff0c;存储方式用的就是sharedPreferences&#xff0c;只是帮我们节…

科技资讯|微软获得AI双肩包专利,Find My防丢背包大火

根据美国商标和专利局&#xff08;USPTO&#xff09;近日公示的清单&#xff0c;微软于今年 5 月提交了一项智能双肩包专利&#xff0c;其亮点在于整合了 AI 技术&#xff0c;可以识别佩戴者周围环境、自动响应用户聊天请求、访问基于云端的信息、以及和其它设备交互。 在此附…

创建ffmpeg vs2019工程

0 写在前面 本文主要参考链接&#xff1a;https://www.cnblogs.com/suiyek/p/15669562.html 感谢作者的付出&#xff1b; 1 目录结构 2 下载yasm和nasm 如果自己在安装VS2019等IDE的时候已经安装了它们&#xff0c;则不用再单独进行安装&#xff0c;比如我这边已经安装了&a…

【VirtualBox】安装Ubuntu

一、新建虚拟系统 点击新建 输入名称&#xff0c;点击下一步 配置内存大小和处理器&#xff0c;点击下一步 选择不添加虚拟硬盘&#xff0c;点击下一步 点击完成 点击继续 二、修改虚拟机硬件配置 选择虚拟机&#xff0c;点击 “设置” 进入 “系统 -> 主板” 页面&…

【计算机组成 课程笔记】1.2 冯·诺伊曼结构

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 1 - 2 - 102-冯诺依曼结构的要点&#xff08;13-59--&#xff09;_哔哩哔哩_bilibili 现代的计算机形态各异&#xff0c;但究其本质&#xff0c;几乎全部采用了冯诺依曼结构。要了解计算机&#xff0c;首先要知道…

数据挖掘导论学习笔记1(第1 、2章)

参考&#xff1a;https://blog.csdn.net/u013232035/article/details/48281659?spm1001.2014.3001.5506 和《数据挖掘导论》学习笔记&#xff08;第1-2章&#xff09;_时机性样本_schdut的博客-CSDN博客 第1章 绪论 数据挖掘是一种技术&#xff0c;它将传统的数据分析方法…

14 mysql bit/json/enum/set 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 bit/json/enum/set 类类型的相关…

android:新建工程文件介绍

一、前言当我们新建一个app时会呈现出固定的工程文件&#xff0c;这篇文章介绍新建工程里的文件。 二、介绍 Structure:就是你选择哪个页面就会显示那个页面的结构&#xff0c;就比如说我选择的是MainActivity他就会显示这个页面所使用的方法。 1-2&#xff1a;是android自动生…

Navicat15天试用期过期解决办法

如果你是windows电脑&#xff0c;发现过期了先把Nvaicat关掉&#xff0c;按照以下步骤可以恢复到15天试用。 1.注册表输入regedit winR打开注册表 2.搜索输入HKEY_CURRENT_USER\Software\PremiumSoft\Navicat 删除Registration15XCS和Update这两个文件夹。 3.搜索HKEY_CURRE…

【Jenkins打包服务,Dockerfile报错:manifest for java : 8 not fourd】

1、问题描述 Jenkins打包服务运行dockerfile里的FROM java:8报错manifest for java : 8 not fourd Caused by: com.spotify. docker.client.exceptions.DockerException: manifest for java:8 not found2、解决方法 在网上查找许多方法后得出这是由于Docker官方已经弃用java…

【kubernetes】k8s部署APISIX及在KubeSphere使用APISIX

Apache APISIX https://apisix.apache.org/ 功能比nginx-ingress更强 本文采用2.5.0版本 https://apisix.apache.org/zh/docs/apisix/2.15/getting-started/ 概述内容来源于官方&#xff0c;学习于马士兵云原生课程 概述 Apache APISIX 是什么&#xff1f; Apache APISIX 是 …

r 安装源码包 安装本地r包

总结一下手动安装R包 - 简书 (jianshu.com)https://www.jianshu.com/p/2a7a36414734 #BiocManager::install("simplifyEnrichment") #BiocManager::install("EnsDb.Hsapiens.v86")#下载包 之后 手动安装 #install.packages("~/datasets/EnsDb.Hsapien…

springboot封装查询快递物流

目录 一、ApiClient代码解读二、ApiService代码解读三、HomeController代码解读四、整体代码五、结果展示 一、ApiClient代码解读 这是一个简单的Spring Boot的RestTemplate客户端&#xff0c;用于执行HTTP请求。 首先&#xff0c;这个类被Component注解标记&#xff0c;这意味…

2024毕业设计选题指南【附选题大全】

title: 毕业设计选题指南 - 如何选择合适的毕业设计题目 date: 2023-08-29 categories: 毕业设计 tags: 选题指南, 毕业设计, 毕业论文, 毕业项目 - 如何选择合适的毕业设计题目 当我们站在大学生活的十字路口&#xff0c;毕业设计便成了我们面临的一项重要使命。这不仅是对我们…

vue训练场练习props和$emit,实现大写输入,小写输出。

场景&#xff1a; 在vue官网训练场&#xff0c;使用训练场中的组件。 仅作为练习笔记&#xff0c;仅供产考。 App.vue 组件代码 方式一&#xff1a;Watch监听 方式二&#xff1a;input绑定