实现复杂树结构返回(不含子树), 并且结点间建立关联

💡 一句话结:
实现传感器和深度及采集的数值动态对应,将不规则的数据转变成固定列头的一行行数据。

🔑 关键信息点:

  1. 通过传感器编号和深度将传感器对应的数值与时间建立关联。
  2. 使用SpringBoot+MyBatis框架实现动态查询不同参数条件下的传感器数据。
  3. 通过动态SQL实现各级数据项的对应查询,动态生成不同条件对应的字段。
  4. 利用HashMap和Set等数据结构处理数据并建立传感器编号和深度的对应关系。
  5. 提供两个版本的代码实现,一个使用Map,一个使用Set,实现对应关系和数据处理。

对应关系分析(掺杂业务逻辑)

如图 简明来讲就是实现传感器和深度及采集的数值动态对应
因为硬件设备的限制, 在数据采集及通过MQ到库中时数据是一个传感器对应一个深度对应一个该传感器的采集值, 我们要做的是列出所有传感器, 以时间为索引, 时间和传感器对应上一个值简单来说就是把一列列不规则的数据, 转变成固定列头的一行行数据
在这里插入图片描述
数据字段返回(简单以json格式展示)
在这里插入图片描述
:这样就对应上标题了tableData有多组, 但是每一组的数值还和日期时间树的结点能对应上, 可以变向理解为tabledata中含有子树(截图比较抽象)

实现

思路: 使用springboot+mybatis框架
mybatis可以动态接收不同参数 (传感器点位,传感器深度, 传感器类型[温湿度]等) 筛选后的传感器编号,并查询匹配传感器对应的数据
返回格式的转化以及查询后格式的完善在业务层完成
效果比对: 上面为原格式没有明显对应关系,下面为转换后的
在这里插入图片描述

Dao层(mapper)

首先是先从SQL实现各级数据项对应, 并实现使用mybatis框架动态接收符合条件的各组传感器
注意使用的resultType不是直接使用的resultMap
这儿需要使用动态SQL, 先使用传感器编号查询接口, 查询出符合条件的传感器编号, 然后动态赋值到case…when中的相关字段, 动态生成不同条件对应的case…when字段进行第二次具体数值的获取查询

  <select id="" resultType="map">
    select
      to_char(detection_time , 'yyyy/MM/dd') as 日期,
      to_char(detection_time , 'hh24:mi:ss') as 时间
      <choose>
        <when test="sensorCodes != null and sensorCodes.size() != 0">
          <foreach item="sensorCode" collection="sensorCodes" separator="">
          <if test=" sensorCode != null and sensorCode != ''">
            ,max(case when sensor_code = '${sensorCode}' then humidity   end) as "${sensorCode}"
          </if>

          </foreach>
        </when>
        <otherwise>
            ,'没有与之对应的传感器编号'
        </otherwise>
      </choose>
      FROM structure_internal_humidity_info
    WHERE 1=1
    <if test="startDate != null">
      AND date_format(detection_time, '%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> ${startDate}
    </if>
    <if test="endDate != null">
      AND date_format(detection_time, '%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> ${endDate}
    </if>
    <if test="observationPointId != null">
      AND observation_point_id = ${observationPointId}
    </if>
    <if test="sensorCodes != null and sensorCodes.size() > 0">
      AND sensor_code IN
      <foreach item="sensorCode" collection="sensorCodes" open="(" separator="," close=")">
        '${sensorCode}'
      </foreach>
    </if>
    GROUP BY
    detection_time
    ORDER BY
    detection_time
    <!--<if test=" pageSize != null and pageSize != ''">-->
    <!--  limit #{pageSize}-->
    <!--</if>-->
    <!--<if test="pageIndex != null and pageIndex != ''">-->
    <!--  offset #{pageIndex}-->
    <!--</if>-->
  </select>

为什么注掉了offset分页, 因为业务代码中使用了mybatis分页, 这样更灵活的解决了分页, 但是不可避免的可能会有Map类或者ArrayList类中会有方法触发意料之外的bug, 留存注释备用! [ 稳妥起见还是不注释掉使用数据库原生的分页不容易踩坑 ]

这儿牵扯到一个子接口根据参数动态查询对应传感器sensorCode 要实现的就是根据参数动态匹配相关的传感器数据, 可以理解为根据不同的位置坐标作为查询条件, 获取不同位置的一组传感器编号

业务实现
分两个版本分别使用java的Map和Set作为主要数据结构进行数据处理hashMap返回, 逻辑图及各数据结构之间的转换后续出图传过来, 时间有限先码上
在这里插入图片描述

版本一

未使用Set

{
	//public CommonPage<Map<String, Object>> queryNewStandardlist(CommonQuery query) {
		List<SensorDeviceInfoPO> sensorCodes = new ArrayList<SensorDeviceInfoPO>();
		if (!(query.getMonitoringDataTypes().equals("STRUCTURE_INTERNAL_HUMIDITY_INFO"))){
			sensorCodes = sensorDeviceInfoMapper.querySensorCodeByDeviceid( query);
		}else {
			throw new BizException(BizCodeEnum.BIZ_FAILURE, "无效的类型");
		}

		List<String> sensorsList = new ArrayList<String>();
		List<BigDecimal> depthList = new ArrayList<BigDecimal>();

		//声明一个变量存储深度和传感器编号,key为传感器编号,value为传感器对应的深度
		Map<String,BigDecimal> sensorDepthMap = new HashMap<String,BigDecimal>();

		for (SensorDeviceInfoPO sensor : sensorCodes) {
			String sensorCode = sensor.getSensorCode();
			BigDecimal depth = sensor.getDepth();
			// 因为有传感器编号为空的情况所以添加非空判断去除编号为空的传感器从而对齐横列和纵列表格数据(后续 如果数据库更新后没有此情况可删除此段代码中的判断)
			if ( ! (sensorCode.isEmpty() || sensorCode.isBlank() ) && ! (depth == null || depth.compareTo(BigDecimal.ZERO) == 0) ){
				//用于结果集查询
				sensorsList.add(sensorCode);
				depthList.add(depth);
				//用于列头传感器和深度值匹配处理
				sensorDepthMap.put(sensorCode,depth);
			}

		}

		query.setSensorCodes(sensorsList);
		int total = 0;
		//TODO 另一种逻辑如果,没有分页条件则不查询总条数(需要优化)
		if (query.getPageIndex() != null || query.getPageSize() != null) {
			QueryBackUp backupQuery = new QueryBackUp(query.getPageIndex(), query.getPageSize()); // 使用Query类的拷贝构造函数创建备份对象
			query.setPageIndex(null);
			query.setPageSize(null);
			total = structureInternalHumidityInfoMapper.queryStandardColumn(query).size();
			query.setPageIndex(backupQuery.getPageIndex());
			query.setPageSize(backupQuery.getPageSize());
		}


		query.setStartDate(
				Optional.ofNullable(query.getStartDate()).orElse(Date.from(LocalDate.now().minusDays(2).atStartOfDay().toInstant(ZoneOffset.ofHours(8)))));
		query.setEndDate(
				Optional.ofNullable(query.getEndDate()).orElse(Date.from(LocalDate.now().atStartOfDay().toInstant(ZoneOffset.ofHours(8)))));
		query.setPageSize(Optional.ofNullable(query.getPageSize()).orElse(16));
		query.setPageIndex(Optional.ofNullable(query.getPageIndex()).orElse(1));
// Page<Map<String, String>> standardResult = PageHelper.startPage(query.getPageIndex(), query.getPageSize()).doSelectPage(() -> {
// Page<Map<String, String>> standardResult = PageHelper.startPage(query.getPageIndex(), query.getPageSize()).doSelectPage(
	// 	new PageRowBounds<Map<String, String>>() {
	// @Override
	// public List<Map<String, String>> doResult(List<Map<String, String>> list) {
	// 	return list != null ? list : Collections.emptyList();
	// }
    //        });

    // List<Map<String, String>> mapperResult =

		// Page<Map<String, String>> standardResult = PageHelper.startPage(query.getPageIndex(), query.getPageSize()).doSelectPage(() ->
		// 	structureInternalHumidityInfoMapper.queryStandardColumn(query));

			// structureInternalHumidityInfoMapper.queryStandardColumn(query);
//     if (mapperResult == null) {
//         mapperResult = Collections.emptyList();
//     }
// });
    		List<Map<String, String>>  standardResult = structureInternalHumidityInfoMapper.queryStandardColumn(query);

		//表格内容用于返回
		// standardResult.getResult();
		List<String> columnSensorCode = new ArrayList<String>();
		List<BigDecimal> columnDepth = new ArrayList<>();
		List<List<String>> tableData = new ArrayList<List<String>>();

		if (!standardResult.isEmpty()) {
			/* 列头排序及传感器与深度动态匹配及传感器与深度动态匹配及传感器与深度动态匹配BEGIN */
			//列头处理, 以及处理列头因为数据结构差异y引发的列头汉字有时候不是排在第一个的问题
			Map<String, String> columnCodeMap = standardResult.get(0);
			//做到编号与深度匹配
			for (Entry<String, String> columnCode : columnCodeMap.entrySet()) {
				//传感器编号
				Object columnCodeValue = columnCode.getKey();
				//传感器深度
				String columnDepthValue = String.valueOf(sensorDepthMap.get(columnCode.getKey()));

				if ( ! (columnDepthValue.isEmpty() || columnDepthValue.isBlank() || columnDepthValue.equals("") || columnDepthValue == null
					|| columnCodeValue.equals("") || columnCodeValue == null) ){
					columnSensorCode.add(String.valueOf(columnCodeValue));

					//sensorDepthMap.put(columnCodeValue,columnDepthValue);
				}
			}
			columnSensorCode.sort(new Comparator<String>() {
				@Override
				public int compare(String o1, String o2) {
					return o1.hashCode ()- o2.hashCode();
				}
			});
			// Check if the first element is not Chinese
			if (! (columnSensorCode.get(0).equals("日期"))) {
				// Reverse the list
				Collections.reverse(columnSensorCode);

				// Swap the first and second elements
				String temp = columnSensorCode.get(0);
				columnSensorCode.set(0, columnSensorCode.get(1));
				columnSensorCode.set(1, temp);
			}
			/* 列头排序及传感器与深度动态匹配及传感器与深度动态匹配及传感器与深度动态匹配END */

			for (Map<String, String> rowDataMap : standardResult)  {

				//遍历结果中的每一行Map
				//rowDataMap  = standardResult.get(i);
				//声明一个List存储每一行Map中的目标值
					List<String> rowData = new ArrayList<String>();

				//循环遍历Map     根据列名动态  取得目标值使值与列名匹配
				for (Object columnName : columnSensorCode) {
					//todo finish   bigDecimal  处理
					Object rowDataValue = rowDataMap.get(columnName);
					//Object depthValue = rowDataMap.get()

					rowData.add(String.valueOf(rowDataValue));
					if (0 == tableData.size()){

						columnDepth.add(sensorDepthMap.get(columnName));
					}

				}
				//用于返回塞值
				tableData.add(rowData);
			}



		Map<String, Object> result = new HashMap<String, Object>();
		result.put("columnSensorCode", columnSensorCode);
		result.put("columnDepth", columnDepth);
		result.put("tableData", tableData);

		CommonPage<Map<String, Object>>  standardResultPage = new CommonPage<Map<String, Object>>();
		standardResultPage.setPageIndex(query.getPageIndex());
		standardResultPage.setPageSize(query.getPageSize());
		standardResultPage.setTotal(total);
		standardResultPage.setData(result);
//System.out.println("result = " + result);
			return standardResultPage;
		}else {
			throw new BizException(BizCodeEnum.BIZ_FAILURE, "无效的类型, 湿度结果为空");
		}

	}

版本二

使用了Set

{

	//public Map<String, Object> queryStandardTableList(CommonQuery query) {
		CommonPage<Map<String, Object>>  resultPage = new CommonPage<>();


		List<SensorDeviceInfoPO> sensorCodes = sensorDeviceInfoMapper.querySensorCodeByDeviceid(query);

		//去除List中的空字符串
		List<String>  sensorCodeList = new ArrayList<String>();
		Map<String,BigDecimal>  sensorCodeDepMap = new HashMap<>();
		for(SensorDeviceInfoPO sensorCode:sensorCodes) {
			String  sensorCodeStr = sensorCode.getSensorCode();
			BigDecimal  sensorCodeDep = sensorCode.getDepth();
			if (!(sensorCodeStr.isEmpty() && String.valueOf(sensorCodeDep).isEmpty() && sensorCodeDep == null && sensorCodeStr == null) ){
				sensorCodeList.add(sensorCodeStr);
				sensorCodeDepMap.put(sensorCodeStr,sensorCodeDep);
			}
		}

		// 使用临时变量保存原始的分页参数,避免影响查询结果
		int originPageIndex = Optional.ofNullable(query.getPageIndex()).orElse(1);
		int originPageSize = Optional.ofNullable(query.getPageSize()).orElse(18);
		
		// 设置传感器代码
		query.setSensorCodes(sensorCodeList);
		
		// 获取结果集总数
		int total = structureInternalTemperatureInfoMapper.queryStandardTableTempData(query).size();
		
		// 设置查询参数的默认值
		query.setPageIndex(originPageIndex);
		query.setPageSize(originPageSize);
		
		// 设置部分参数默认值
		query.setStartDate(
			Optional.ofNullable(query.getStartDate())
				.orElseGet(() -> Date.from(LocalDate.now().minusDays(2).atStartOfDay().toInstant(ZoneOffset.ofHours(8))))
		);
		query.setPageSize(Optional.ofNullable(query.getPageSize() ).orElse(18));
		query.setPageIndex(Optional.ofNullable(query.getPageIndex()).orElse(1));

		 //查询结果集
		 List<Map<String, String>> dynamicResults = structureInternalTemperatureInfoMapper.queryStandardTableTempData(query);

		 //使用mybatis 分页插件
		// 	AtomicReference<List<Map<String, String>>> dynamicResultsMapper = null;
		// Page<Map<String, String>> dynamicResults = PageHelper.startPage(query.getPageIndex(), query.getPageSize()).doSelectPage( () ->{
		// 			dynamicResultsMapper.set(structureInternalTemperatureInfoMapper.queryStandardTableTempData(query));
		// });

		//动态处理映射属性中的动态列名
		List<String> columnHeaders = new ArrayList<>();
		List<BigDecimal> depths = new ArrayList<>();
		List<List<String>> tableData = new ArrayList<>();
		Set<String> uniqueSensorCodeSet = new HashSet<>();

		if (!dynamicResults.isEmpty()) {
			//动态列头
			// 拼接dynamicResults.get(0)和dynamicResults.get(1)的去重值
			uniqueSensorCodeSet.addAll(dynamicResults.get(0).keySet());
			uniqueSensorCodeSet.addAll(dynamicResults.get(1).keySet());

			/*列头处理begin*/
			/* 根据传感器编码动态匹配目标值    动态结果集列头 */
			// 拼接dynamicResults.get(0)和get(1)中的不重复值作为列头, 将去重后的值作为sensorCodeRow的键
			Map<String, String> newSensorCodeRow = new HashMap<>();
			for (String uniqueKey : uniqueSensorCodeSet) {
				newSensorCodeRow.put(uniqueKey, uniqueKey);
			}

			for (Entry<String, String> entry : newSensorCodeRow.entrySet()) {
				String columnName = entry.getKey();
				// if (columnName.contains((CharSequence) dynamicResults.get(0)) || columnName.contains((CharSequence) dynamicResults.get(1))) {
					uniqueSensorCodeSet.add(columnName);
				// }
			}

			// 将不重复的列名添加到columnHeaders中
			columnHeaders.addAll(uniqueSensorCodeSet);

			//对列头进行排序从而对tableData进行排序
			// columnHeaders.sort(new Comparator<String>() {
			// 	@Override
			// 	public int compare(String o1, String o2) {
			// 		return o1.hashCode() - o2.hashCode();
			// 	}
			// });
			// 使用jdk11的排序三目运算符简洁写法但是有时会把汉字排到最后, 和上面两种排序方法哪种生效使用哪一个
			columnHeaders.sort(String::compareTo);
			 // 解决上述汉字后排问题,使用上面这种写法有时候会导致汉字排到后面面,所以使用jdk8的排序方法针对汉字进行排序让日期排第一个时间排第二个
			if (! (columnHeaders.get(0).equals("日期"))) {
				// Reverse the list
				Collections.reverse(columnHeaders);

				// Swap the first and second elements
				String temp = columnHeaders.get(0);
				columnHeaders.set(0, columnHeaders.get(1));
				columnHeaders.set(1, temp);
			}

			//根据排序后的传感器编号取得深度值的数据
			for (String senorCode : columnHeaders) {
				depths.add(sensorCodeDepMap.get(senorCode));
			}
			/*列头处理end*/

			//表格内容
			for (Map<String, String> rowDataMap : dynamicResults) {
				List<String> rowData = new ArrayList<>();

				//按照列头具体数据动态抽取表格数据
				for (String columnName : columnHeaders) {

					String cellData = rowDataMap.get(columnName);
					if (cellData == null) {
						rowData.add(""); // 如果当前行数据中没有对应的列数据,添加空字符串
					} else {
						rowData.add(cellData);
					}
				}
				tableData.add(rowData);
			}


			Map<String , Object> result = new HashMap<>();
			result.put("columnHeaders", columnHeaders);
			result.put("depth",depths);
			result.put("tableData", tableData);

			resultPage.setPageIndex(query.getPageIndex());
			resultPage.setPageSize(query.getPageSize());
			resultPage.setTotal(total);
			resultPage.setData(result);

			//return structureInternalTemperatureInfoMapper.queryStandardTableTempData(sensorCodes,startDate,endDate,observationPointId);
			// return (CommonPage<List<StructureInternalTemperatureInfoPO>>)
			return resultPage;
		}else{
			throw new BizException(BizCodeEnum.BIZ_FAILURE,"暂无内部温度数据");
		}
	}

析: 这两段代码都处理了参数筛选传感器将传感器编号传给SQL , 接受SQL返回的数据并将列头 ( 动态的传感器编号组和传感器对应的深度 ) 数据: (传感器检测的数值 ) 包装成不同的树结点返回给接收方
上面提到的有没有用到Set的使用与否, 主要处理的就是列头传感器与传感器深度的对应这儿的列头与数据看成Excel表格中的表头和表头对应的数据

个人目前感觉Set和其他数据集混用的好一点, 浅显一点的理解就是可以少声明一个变量

End

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

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

相关文章

Nginx实现负载均衡与故障检查自动切换

创作灵感来源于个人项目的一个稳定性规划&#xff0c;单节点的项目稳定性方面可能有很大的缺漏&#xff0c;因此需要升级为多节点&#xff0c;保证服务故障后&#xff0c;依然有其他服务可用&#xff0c;不会给前端用户造成影响。 &#xff08;前面讲选型&#xff0c;想直接看…

亚马逊自养号测评环境搭建技巧:打造防关联底层环境的关键步骤

今天我们要聊的是完全由人工操作的自养号方法&#xff0c;相信有过相关经验的朋友们都清楚&#xff0c;在实现自养号的过程中&#xff0c;所使用的 IP 和浏览器究竟有哪些选择&#xff0c;以及可能会遇到哪些问题。 首先&#xff0c;我们来看看市场上现有的 IP 类型以及可能出现…

全网最全网络基础思维导图合集(38张)

计算机网络基础知识点多且杂&#xff0c;想要系统地学习&#xff0c;思维导图肯定是必不可少的。 今天整理了38张思维导图&#xff0c;帮助你轻松理清思路&#xff0c;快速掌握关键内容。建议你收藏起来慢慢看&#xff0c;在看过之后最好能重新动手画一画&#xff0c;让计算机…

如何获取一个城市或者一个区域的玫瑰风向图?

玫瑰风向图是一种直观展示风向和风速的图形工具&#xff0c;它在气象学、城市规划、农业等领域都有广泛的应用。那么&#xff0c;如何获取某个城市或某个区域的玫瑰风向图呢&#xff1f; 首先&#xff0c;我们可以借助互联网资源获取玫瑰风向图。现代网络技术发达&#xff0c;…

CentOS部署NFS

NFS服务端 部署NFS服务端 sudo yum install -y nfs-utils挂载目录 给 NFS 指定一个存储位置&#xff0c;也就是网络共享目录。一般来说&#xff0c;应该建立一个专门的 /data 目录&#xff0c;方便起见使用临时目录 /tmp/nfs&#xff1a; mkdir -p /tmp/nfs #修改权限 chmo…

vue使用海康的H5视频播放器开发包实时预览监控画面

使用原因 之前用海康的视频WEB插件实现过监控画面在前端页面的实时预览&#xff0c;但是会有两个问题&#xff1a; 1、该插件需要先进行安装&#xff0c;而且每次开机后也要重新启动该插件&#xff1b; 2、使用该插件很难更改其样式&#xff0c;只能使用其自带的窗口&#xff…

JavaSE——类和对象(二)~~封装

目录 一.封装 二.封装扩展之包 三.static成员 四. 代码块 五. 内部类&#xff08;重要&#xff09; 大家好呀&#xff0c;我是北纬&#xff0c;接着上节我们继续讲解Java中关于类和对象的相关知识&#xff0c;今天着重给大家介绍一下关于面向对象程序的特性之一——封装。…

【网络安全】网络安全协议的重要性

一.网络安全 1.什么是网络安全 网络安全&#xff08;Cyber Security&#xff09;是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 2.网络安…

DQL(数据查询)

目录 1. DQL概念 2. DQL - 编写顺序 3. 基础查询 3.1 查询多个字段 3.2 字段设置别名 3.3 去除重复记录 3.4 案例 4. 条件查询 4.1 语法 4.2 条件 4.3 案例&#xff1a; 5. 聚合函数 5.1 常见的聚合函数&#xff1a; 5.2 语法 5.3 案例&#xff1a; 6. 分组查…

台灯哪个牌子好?五款性价比高的照明品牌分享

在近几年&#xff0c;儿童长时间使用电子产品已成为普遍现象&#xff0c;这无疑增加了视觉负担。其次&#xff0c;现代教育体系下的学习任务之繁重&#xff0c;与80后、90后学生时代相比&#xff0c;有了显著的加重。而且&#xff0c;学习过程对数码设备的依赖性也大大增加&…

知识分享:大数据信用花导致的评分不足多久能恢复

随着金融风控领域越来越科技化&#xff0c;基于大数据技术的金融风控成为了贷前风控不可或缺的重要环节&#xff0c;相信很多人在申贷的时候都听说过大数据信用和综合评分等词语&#xff0c;那大数据信用花导致的评分不足多久能恢复呢?本文带大家一起去了解一下。 首先&#x…

PD协议:引领电子设备充电新时代

随着科技的飞速发展&#xff0c;电子设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;这些设备的充电问题一直困扰着广大用户。传统的充电方式不仅效率低下&#xff0c;而且存在着安全隐患。为了解决这一问题&#xff0c;USB Implementers Forum&#xff08;USB-IF…

机器学习-决策树算法

前言 本篇介绍决策树与随机森林的内容&#xff0c;先完成了决策树的部分。 决策树 决策树(Decision Tree)是一种有监督学习的方法&#xff0c;可以同时解决分类和回归问题&#xff0c;它能够从一系列有特征和标签的数据中总结出决策规则&#xff0c;并用树状图的结构来呈现这…

WPF中MVVM架构学习笔记

MVVM架构是一种基于数据驱动的软件开发架构&#xff0c;它将数据模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和视图模型&#xff08;ViewModel&#xff09;三者进行分离&#xff0c;使得开发者可以更加专注于各自领域的开发。其中&#xff0c;Model负…

系统架构师考试(十)

SaaS为在线客服 PaaS为二次开发&#xff0c;比如低代码平台 IaaS 硬件开发 B 是基础设施作为服务 软件架构的概念 架构风格 数据流风格 网络报文是在计算机网络中通过网络传输的数据单元&#xff0c;它是网络通信的基本单位。网络报文包含了发送方和接收方之间传输的数据&…

蛮力法0/1背包问题实验

实验项目1 蛮力法 实验题目 使用蛮力法解决0/1背包问题。 ​ 问题描述&#xff1a;给定n个重量(weight)为{w1, w2, … ,wn}、价值(key)为{v1, v2, … ,vn}的物品和一个**容量为C(contain)**的背包&#xff0c;求这些物品中的一个最有价值的子集&#xff0c;且要能够装到背包中…

第十三期Big Demo Day亮点项目:CCarbon重塑碳交易生态,助力全球绿色发展

第十三期Big Demo Day活动即将于2024年5月28日在香港数码港的CyberArena隆重举行。我们荣幸地宣布&#xff0c;利用区块链技术优化全球碳交易CCarbon项目将亮相&#xff0c;参与精彩的项目路演。本次活动由ZeeprLabs、BiKing Exchange、Gather冠名赞助&#xff0c;Central Rese…

【教学类-56-03】数感训练——数字03(寻找自己的学号数字,1号-31号,出现15-20次)

背景需求&#xff1a; 在实际操作中&#xff0c;孩子们把数字当做了自己的学好&#xff0c;这个提示老师可以给每位孩子做一份“学号数感训练 【教学类-56-02】数感训练——数字02&#xff08;控制指定数字出现的数量&#xff09;-CSDN博客文章浏览阅读341次&#xff0c;点赞…

【Linux学习】深入探索进程等待与进程退出码和退出信号

文章目录 退出码return退出 进程的等待进程等待的方法 退出码 main函数的返回值&#xff1a;进程的退出码。 一般为0表示成功&#xff0c;非0表示失败。 每一个非0退出码都表示一个失败的原因&#xff1b; echo $&#xff1f;命令 作用&#xff1a;查看进程退出码。&#xf…

学AI绘图【300集SD新课】--Stable Diffusion教程

学AI绘图需要以下步骤&#xff1a; 明确目标和需求&#xff1a;首先明确设计图的目的&#xff0c;是用于展示算法流程、模型结构还是其他目的。选择合适的工具&#xff1a;根据需求选择合适的绘图工具&#xff0c;如Visio、PowerPoint、Adobe Illustrator等。绘制草图&#xf…