当前位置: 首页 > news >正文

【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}

相关文章:

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

需求&#xff1a; 1.有一组数据集合&#xff0c;数据集合中的数据为动态&#xff1b; 举例如下&#xff1a; [{province陕西省, city西安市}, {province陕西省, city咸阳市}, {province陕西省, city宝鸡市}, {province陕西省, city延安市}, {province陕西省, city汉中市}, {pr…...

C#将text文本中的单双行分开单独保存

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 文本的分割1.设定text文件的名称为02.文本导出 文本的分割 1.设定text文件的名称为0 代码如下&#xff1a; using System; using System.Collections.Generic; us…...

深入理解 Go 语言中的 iota

iota是go语言的常量计数器&#xff0c;只能在常量表达式中使用&#xff0c;iota在const关键字出现时将被重置为0&#xff0c;const中每新增一行常量声明将使iota计数一次&#xff0c;可理解为const语句块中的行索引。它会自动递增&#xff0c;从0开始。 修改步长 尽管默认步长…...

【力扣】55、跳跃游戏

var canJump function(nums){let cover 0;for(let i0;i<nums.length;i){if(i<cover){cover Math.max(nums[i]i,cover);if(cover >nums.length-1){return true;}}}}...

个人与公司合作,怎么代开发票?有哪些优惠政策?

《梅梅谈税》专注于企业税务筹划&#xff01;助力企业合理、合规、合法进行节税税收筹划&#xff01; 当下越来越多的个人与公司直接发生业务往来&#xff0c;例如个人给企业提供技术服务&#xff0c;做宣传推广等&#xff0c;业务完成公司给个人支付了相关费用后&#xff0c;…...

什么是计算机视觉,计算机视觉的主要任务及应用

目录 1. 什么是计算机视觉 2. 计算机视觉的主要任务及应用 2.1 图像分类 2.1.1 图像分类的主要流程 2.2 目标检测 2.2.1 目标检测的主要流程 2.3 图像分割 2.3.1 图像分割的主要流程 2.4 人脸识别 2.4.1 人脸识别的主要流程 对于我们人类来说&#xff0c;要想认出身边…...

网易24届内推

【网易】2024届网易互联网秋季校园招聘内推开始啦&#xff01;给你分享我的专属内推邀请函&#xff1a;https://bole.campus.163.com/campus/home?projectId55&type99&isShare1&boleId7b842acc7c2b42db&boleType2&signatured5f2a3dc23bed70777a8be1a14b49…...

redis 应用 4: HyperLogLog

我们先思考一个常见的业务问题&#xff1a;如果你负责开发维护一个大型的网站&#xff0c;有一天老板找产品经理要网站每个网页每天的 UV 数据&#xff0c;然后让你来开发这个统计模块&#xff0c;你会如何实现&#xff1f; img 如果统计 PV 那非常好办&#xff0c;给每个网页一…...

进程的挂起状态

进程的挂起状态详解 当我们谈论操作系统和进程管理时&#xff0c;我们经常听到进程的各种状态&#xff0c;如“就绪”、“运行”和“阻塞”。但其中一个不那么常被提及&#xff0c;但同样重要的状态是“挂起”状态。本文将深入探讨挂起状态&#xff0c;以及为什么和在何时进程…...

idea 链接mysql连不上

打开文件 C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\jbr\conf\security\java.security修改内容 搜索&#xff1a;jdk.tls.disabledAlgorithms 修改 链接地址 在链接后面添加 ?useSSLfalse jdbc:mysql://127.0.0.1:3306/db_admin3?useSSLfalse...

Ubuntu 启动出现grub rescue

​ 一&#xff0c;原因 原因&#xff1a;出现 “grub rescue” 错误通常表示您的计算机无法正常引导到操作系统&#xff0c;而是进入了 GRUB&#xff08;Grand Unified Bootloader&#xff09;紧急模式。这可能是由于引导加载程序配置错误、硬盘驱动器损坏或其他引导问题引起…...

go中runtime包里面的mutex是什么?runtime.mutex解析

其实在看go源码的时候&#xff0c;发现除了sync包里有个mutex以外&#xff0c;runtime包里也有一个mutex&#xff0c;这个mutex在runtime很多地方都在用。 这个runtime包里面的mutex的结构如下&#xff1a; 目录: /runtime/runtime2.go 代码&#xff1a; type mutex struct …...

VScode 调试python程序,debug状态闪断问题的解决方法

0. Few words 之前一直在VSCode中debug C和Python的程序没出过闪断的问题&#xff0c;但是最近在另一台电脑上debug&#xff0c;同样的方法&#xff0c;设置launch.json和CMakeList加debug状态等等操作&#xff0c;如我另一篇blog写的一样&#xff0c;可以点这里查看。 但是&a…...

飞桨中的李宏毅课程中的第一个项目——PM2.5的预测

所谓的激活函数&#xff0c;就是李宏毅老师讲到的sigmoid函数 和 hard sigmoid函数 &#xff0c;ReLU函数那些 现在一点点慢慢探索&#xff0c;会成为日后想都做不到的经历&#xff0c;当你啥也不会的时候&#xff0c;才是慢慢享受探索的过程。 有一说一&#xff0c;用chatGP…...

Qt---对话框 事件处理 如何发布自己写的软件

目录 一、对话框 1.1 消息对话框&#xff08;QMessageBox&#xff09; 1> 消息对话框提供了一个模态的对话框&#xff0c;用来提示用户信息&#xff0c;或者询问用户问题并得到回答 2> 基于属性版本的API 3> 基于静态成员函数版本 4> 对话框案例 1、ui界面 …...

【C++】C++ 引用详解 ⑩ ( 常量引用案例 )

文章目录 一、常量引用语法1、语法简介2、常引用语法示例 二、常量引用语法1、int 类型常量引用示例2、结构体类型常量引用示例 在 C 语言中 , 常量引用 是 引用类型 的一种 ; 借助 常量引用 , 可以将一个变量引用 作为实参 传递给一个函数形参 , 同时保证该值不会在函数内部被…...

React原理 - React Reconciliation-下

目录 Fiber Reconciler 【react v16.13.1】 React Fiber需要解决的问题 React Fiber的数据结构 时间分片 Fiber Reconciler 的调度 双缓冲 池概念 小节 练习 Fiber Reconciler 【react v16.13.1】 Fiber 协调 优化了栈协调的事务性弊端引起的卡顿 React Fiber需要解决…...

YOLOv8超参数调优教程! 使用Ray Tune进行高效的超参数调优!

原创文章为博主个人所有,未经授权不得转载、摘编、倒卖、洗稿或利用其它方式使用上述作品。违反上述声明者,本站将追求其相关法律责任。 这篇博文带大家玩点新的东西,也是一直以来困扰大家最大的问题—超参数调优! 之前的 YOLOv5 我使用遗传算法做过很多次调优,实验一跑就…...

JVM运行时数据区

文章目录 JVM内存结构图1、运行时数据区域JDK 1.7JDK 1.81. 线程栈&#xff08;虚拟机栈&#xff09;2. 本地方法栈3. 程序计数器4. 方法区&#xff08;元空间&#xff09;5. 堆6、运行时常量池&#xff08;Runtime Constant Pool&#xff09;7、直接内存&#xff08;Direct Me…...

第七章,相似矩阵及其应用,3-二次型、合同矩阵与合同变换

第七章&#xff0c;相似矩阵及其应用&#xff0c;3-二次型、合同矩阵与合同变换 二次型相关概念二次型二次型的标准形和规范形表示形式 合同矩阵与合同变换定义 合同合同矩阵的性质等价、相似、合同三种关系的对比等价相似合同 玩转线性代数(38)二次型概念、合同矩阵与合同变换…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...