前言

在最近的工作中,由于导入模板除了前三列(姓名、手机号、实发工资)固定;其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理。

一、数据模板数据展示:

(1)模板一

(2)模板二

二、处理思路

观察两个模板的数据;结合面向对象的编程思想设计;我可以将两模板需要的获取的字段属性归纳为5个属性点:
注意:标题头在以下中不算!!!

索引(index)-- 相当于excel中所在列的下标列索引
列名称(name)-- 相当于excel中所在列的名称
列值(value)-- 相当于excel中所在列的值
是否存在合并单元格(isGrossField)-- 相当于excel中所在列的是否有合并单元格
合并的子元素(child)-- 相当于excel中所在列的是否有合并单元格下所包含的列

三、编程准备

1、实体类创建:

/**
* @project
* @Description
* @Author songwp
* @Date 2022/8/17 9:04
* @Version 1.0.0
**/
@Data
public class TreeExcel implements Serializable { private int index = 0; private String name; private String value; private boolean isGrossField; private List<TreeExcel> childs;
}

2、maven依赖的引入

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta2</version>
</dependency>

3、文件解析工具类的编写

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.fastjson.JSONArray;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue; /**
* @project
* @Description
* @Author songwp
* @Date 2022/8/17 9:09
* @Version 1.0.0
**/
public class ExcelUtil { private String value = "empty"; private List<ExcelUtil> nodes; public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public void createExcelJson(List<TreeExcel> treeExcelList, int valueQueueSize, Queue<String> linkedValue, boolean firstStorey) {
if (null != nodes && !firstStorey) {
TreeExcel treeExcel = new TreeExcel();
treeExcel.setGrossField(true);
treeExcel.setName(treeExcel.getName());
treeExcel.setIndex(valueQueueSize - linkedValue.size()); List<TreeExcel> listElem = new ArrayList<>();
treeExcel.setChilds(listElem);
for (ExcelUtil tree : nodes) {
tree.createExcelJson(listElem, valueQueueSize, linkedValue, false);
}
treeExcelList.add(treeExcel);
} else {
if (firstStorey) {
for (ExcelUtil tree : nodes) {
tree.createExcelJson(treeExcelList, valueQueueSize, linkedValue, false);
}
return;
}
TreeExcel treeExcel = new TreeExcel();
treeExcel.setIndex(valueQueueSize - linkedValue.size());
treeExcel.setName(treeExcel.getName());
treeExcel.setValue(linkedValue.poll());
treeExcel.setGrossField(false);
treeExcelList.add(treeExcel);
}
} /**
* 获取树状数据结构
*
* @param inputStream
* @return
* @throws Exception
*/
public static JSONArray getExcelParseJSON(InputStream inputStream) throws Exception {
List<Object> read = EasyExcelFactory.read(inputStream, new Sheet(1, 0));
Map<String, Object> data = new HashMap<>();
int startDataLine = 0;
ExcelTreeUtils tree = new ExcelTreeUtils();
Queue<ExcelTreeUtils> queue = new LinkedBlockingQueue<>();
for (int i = 0; i < read.size(); i++) {
Object line = read.get(i);
ArrayList<String> lineList = (ArrayList<String>) line; if (i > 0 && null != lineList.get(0) && startDataLine == 0) {
startDataLine = i;
break;
}
Queue<ExcelTreeUtils> nextQueue = new LinkedBlockingQueue<>();
for (int j = 0; j < lineList.size(); j++) {
String elem = lineList.get(j);
if (null != elem) {
if (i == 0) {
List<ExcelTreeUtils> nodes = tree.getNodes();
if (null == nodes) {
nodes = new ArrayList<>();
tree.setNodes(nodes);
}
ExcelTreeUtils currentTree = new ExcelTreeUtils(elem, j);
nodes.add(currentTree);
queue.add(currentTree);
} else {
ExcelTreeUtils currentQueueTree = queue.peek();
while (j >= queue.peek().getExcelColumnIndex()) {
nextQueue.add(queue.poll());
currentQueueTree = queue.peek();
}
List<ExcelTreeUtils> nodes = currentQueueTree.getNodes();
if (null == nodes) {
nodes = new ArrayList<>();
currentQueueTree.setNodes(nodes);
}
ExcelTreeUtils currentTree = new ExcelTreeUtils(elem, j);
nodes.add(currentTree);
nextQueue.add(currentTree);
}
}
}
if (i > 0) {
queue = nextQueue;
}
Queue<ExcelTreeUtils> newQueue = new LinkedBlockingQueue<>();
while (null != queue.peek()) {
ExcelTreeUtils poll = queue.poll();
if (null != queue.peek()) {
poll.setExcelColumnIndex(queue.peek().getExcelColumnIndex());
} else {
poll.setExcelColumnIndex(i);
}
newQueue.add(poll);
}
queue = newQueue;
}
Queue<String> valueQueue = new LinkedBlockingQueue<>();
JSONArray resultJsonArray = new JSONArray();
for (int i = startDataLine; i < read.size(); i++) {
Object line = read.get(i);
ArrayList<String> lineList = (ArrayList<String>) line;
for (int j = 0; j < lineList.size(); j++) {
String elem = lineList.get(j);
if (null == elem) elem = "";
valueQueue.add(elem);
}
JSONArray jsonArray = new JSONArray();
tree.createStructeddJson(jsonArray, valueQueue.size(), valueQueue, true);
resultJsonArray.add(jsonArray);
}
return resultJsonArray;
}
}

4、测试类的编写

 public static void main(String[] args) throws Exception {
InputStream fis = new FileInputStream("C:\\Users\\Lenovo\\Desktop\\工作簿1.xlsx");
JSONArray jsonArray = getExcelParseJSON(fis);
System.out.println(jsonArray);
TreeExcel treeExcel = new TreeExcel();
for (Object salaryObject : jsonArray) {
JSONArray salaryInfo = (JSONArray) salaryObject;
treeExcel.setIndex(Integer.parseInt(((Map) salaryInfo.get(0)).get("index").toString()));
treeExcel.setName(((Map) salaryInfo.get(0)).get("name").toString());
treeExcel.setValue(((Map) salaryInfo.get(0)).get("value").toString());
treeExcel.setGrossField(Boolean.getBoolean(((Map) salaryInfo.get(0)).get("isGrossField").toString()));
}
System.out.println(treeExcel);
}

5、日志输出展示

 注意:因为自己的实体在循环外面展示;所以循环里面赋值存在覆盖;所以获取到的是最后一条数据对应信息

(1)模板一:

(2)模板二:

6、返回的json展示:

(1)模板一:

[
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"张三"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000000"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200000"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2000"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"300"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"25%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1231"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":""
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"李四"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000001"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200001"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2001"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"301"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"125%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1232"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"王五"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000002"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200002"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2002"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"302"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":""
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1233"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"赵老六"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000003"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200003"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2003"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"303"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"325%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1234"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"小明"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000004"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200004"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2004"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"304"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"425%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1235"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
]
]

(2)模板二:

[
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"张三"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18700000000"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"25000"
},
{
"name":"应发工资",
"isGrossField":true,
"child":[
{
"name":"出勤\n天数",
"index":3,
"isGrossField":false,
"value":"22"
},
{
"name":"岗位工资系数",
"index":4,
"isGrossField":false,
"value":"3500"
},
{
"name":"岗位工\n资标准",
"index":5,
"isGrossField":false,
"value":"13000"
},
{
"name":"岗位工资",
"index":6,
"isGrossField":false,
"value":"3500"
},
{
"name":"绩效系数",
"index":7,
"isGrossField":false,
"value":"150"
},
{
"name":"绩效奖金标准",
"index":8,
"isGrossField":false,
"value":"100"
},
{
"name":"个人绩效分数",
"index":9,
"isGrossField":false,
"value":"100"
},
{
"name":"绩效奖金",
"index":10,
"isGrossField":false,
"value":"1000"
},
{
"name":"工龄补贴",
"index":11,
"isGrossField":false,
"value":"1000"
},
{
"name":"职称津贴",
"index":12,
"isGrossField":false,
"value":""
},
{
"name":"话费补贴",
"index":13,
"isGrossField":false,
"value":"100"
},
{
"name":"证书津贴",
"index":14,
"isGrossField":false,
"value":"1000"
},
{
"name":"保密津贴",
"index":15,
"isGrossField":false,
"value":"100"
},
{
"name":"午餐补贴",
"index":16,
"isGrossField":false,
"value":""
},
{
"name":"医疗补贴",
"index":17,
"isGrossField":false,
"value":"1000"
},
{
"name":"交通补贴",
"index":18,
"isGrossField":false,
"value":"1000"
},
{
"name":"降温费",
"index":19,
"isGrossField":false,
"value":"100"
},
{
"name":"差额",
"index":20,
"isGrossField":false,
"value":"100"
},
{
"name":"小计",
"index":21,
"isGrossField":false,
"value":"1000"
}
]
},
{
"name":"应扣款项",
"isGrossField":true,
"child":[
{
"name":"旷工\n天数",
"index":22,
"isGrossField":false,
"value":"1"
},
{
"name":"旷工扣款",
"index":23,
"isGrossField":false,
"value":"100"
},
{
"name":"事假\n天数",
"index":24,
"isGrossField":false,
"value":"1"
},
{
"name":"事假扣款",
"index":25,
"isGrossField":false,
"value":"100"
},
{
"name":"病假\n天数",
"index":26,
"isGrossField":false,
"value":"1"
},
{
"name":"病假扣款",
"index":27,
"isGrossField":false,
"value":"100"
},
{
"name":"小计",
"index":28,
"isGrossField":false,
"value":"300"
}
]
},
{
"name":"应发合计",
"index":29,
"isGrossField":false,
"value":"40000"
},
{
"name":"07月社保、06月医疗及07月公积金扣款",
"isGrossField":true,
"child":[
{
"name":"月养老保险",
"index":30,
"isGrossField":false,
"value":"500"
},
{
"name":"月医疗保险",
"index":31,
"isGrossField":false,
"value":"600"
},
{
"name":"月大额补充",
"index":32,
"isGrossField":false,
"value":"700"
},
{
"name":"月失业保险",
"index":33,
"isGrossField":false,
"value":"800"
},
{
"name":"社保补缴养老",
"index":34,
"isGrossField":false,
"value":"900"
},
{
"name":"社保补缴大额",
"index":35,
"isGrossField":false,
"value":"100"
},
{
"name":"社保补缴\n医疗",
"index":36,
"isGrossField":false,
"value":"110"
},
{
"name":"公积金",
"index":37,
"isGrossField":false,
"value":"120"
}
]
},
{
"name":"社保公积当月合计",
"index":38,
"isGrossField":false,
"value":"130"
},
{
"name":"六项附加当月",
"index":39,
"isGrossField":false,
"value":"140"
},
{
"name":"个税",
"index":40,
"isGrossField":false,
"value":"150"
},
{
"name":"补偿",
"index":41,
"isGrossField":false,
"value":"1600"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"李四"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000000"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"20000"
},
{
"name":"应发工资",
"isGrossField":true,
"child":[
{
"name":"出勤\n天数",
"index":3,
"isGrossField":false,
"value":"21"
},
{
"name":"岗位工资系数",
"index":4,
"isGrossField":false,
"value":"3500"
},
{
"name":"岗位工\n资标准",
"index":5,
"isGrossField":false,
"value":"13000"
},
{
"name":"岗位工资",
"index":6,
"isGrossField":false,
"value":"3500"
},
{
"name":"绩效系数",
"index":7,
"isGrossField":false,
"value":"200"
},
{
"name":"绩效奖金标准",
"index":8,
"isGrossField":false,
"value":"200"
},
{
"name":"个人绩效分数",
"index":9,
"isGrossField":false,
"value":"200"
},
{
"name":"绩效奖金",
"index":10,
"isGrossField":false,
"value":"2000"
},
{
"name":"工龄补贴",
"index":11,
"isGrossField":false,
"value":""
},
{
"name":"职称津贴",
"index":12,
"isGrossField":false,
"value":"2000"
},
{
"name":"话费补贴",
"index":13,
"isGrossField":false,
"value":"200"
},
{
"name":"证书津贴",
"index":14,
"isGrossField":false,
"value":"2000"
},
{
"name":"保密津贴",
"index":15,
"isGrossField":false,
"value":"200"
},
{
"name":"午餐补贴",
"index":16,
"isGrossField":false,
"value":"2000"
},
{
"name":"医疗补贴",
"index":17,
"isGrossField":false,
"value":"2000"
},
{
"name":"交通补贴",
"index":18,
"isGrossField":false,
"value":"2000"
},
{
"name":"降温费",
"index":19,
"isGrossField":false,
"value":"200"
},
{
"name":"差额",
"index":20,
"isGrossField":false,
"value":"200"
},
{
"name":"小计",
"index":21,
"isGrossField":false,
"value":"2000"
}
]
},
{
"name":"应扣款项",
"isGrossField":true,
"child":[
{
"name":"旷工\n天数",
"index":22,
"isGrossField":false,
"value":"2"
},
{
"name":"旷工扣款",
"index":23,
"isGrossField":false,
"value":"200"
},
{
"name":"事假\n天数",
"index":24,
"isGrossField":false,
"value":"2"
},
{
"name":"事假扣款",
"index":25,
"isGrossField":false,
"value":"200"
},
{
"name":"病假\n天数",
"index":26,
"isGrossField":false,
"value":"2"
},
{
"name":"病假扣款",
"index":27,
"isGrossField":false,
"value":"200"
},
{
"name":"小计",
"index":28,
"isGrossField":false,
"value":"400"
}
]
},
{
"name":"应发合计",
"index":29,
"isGrossField":false,
"value":"50000"
},
{
"name":"07月社保、06月医疗及07月公积金扣款",
"isGrossField":true,
"child":[
{
"name":"月养老保险",
"index":30,
"isGrossField":false,
"value":"600"
},
{
"name":"月医疗保险",
"index":31,
"isGrossField":false,
"value":"700"
},
{
"name":"月大额补充",
"index":32,
"isGrossField":false,
"value":"800"
},
{
"name":"月失业保险",
"index":33,
"isGrossField":false,
"value":"900"
},
{
"name":"社保补缴养老",
"index":34,
"isGrossField":false,
"value":"1000"
},
{
"name":"社保补缴大额",
"index":35,
"isGrossField":false,
"value":"110"
},
{
"name":"社保补缴\n医疗",
"index":36,
"isGrossField":false,
"value":"120"
},
{
"name":"公积金",
"index":37,
"isGrossField":false,
"value":"130"
}
]
},
{
"name":"社保公积当月合计",
"index":38,
"isGrossField":false,
"value":"140"
},
{
"name":"六项附加当月",
"index":39,
"isGrossField":false,
"value":"150"
},
{
"name":"个税",
"index":40,
"isGrossField":false,
"value":"160"
},
{
"name":"补偿",
"index":41,
"isGrossField":false,
"value":"1700"
}
]
]

SpingBoot解析Excel数据的更多相关文章

  1. oracle xmltype导入并解析Excel数据--前言

    通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...

  2. 解析Excel数据

    解析Excel数据常用的方式就是使用POI和JXL工具了,这两种工具使用起来有些类似,这里记录一下使用方式提供个参考 POI使用 File file = new File(filePath); Fil ...

  3. POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)

    实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...

  4. oracle xmltype导入并解析Excel数据 (四)特别说明

    1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...

  5. oracle xmltype导入并解析Excel数据 (三)解析Excel数据

    包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...

  6. oracle xmltype导入并解析Excel数据 (一)创建表与序

    表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...

  7. 使用python三方库xlrd解析excel数据

    excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...

  8. oracle xmltype导入并解析Excel数据 (二)规则说明

    规则表字段说明如下: 其中RULE_FUNC_CUSTOMIZE表示,用户自己写函数,去判断数据是否合法,存储的是函数的名字 此函数的参数只有一个,该列的值,字段类型是Varchar2, 校验失败的话 ...

  9. 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据并且获取其中某列数据

    演示效果参考如下:XML转JSON 另一个搭配SQL实现:http://sheetjs.com/sexql/index.html 详细介绍: 1.首先需要导入js <script src=&qu ...

随机推荐

  1. Spring Ioc源码分析系列--自动注入循环依赖的处理

    Spring Ioc源码分析系列--自动注入循环依赖的处理 前言 前面的文章Spring Ioc源码分析系列--Bean实例化过程(二)在讲解到Spring创建bean出现循环依赖的时候并没有深入去分 ...

  2. Jmeter跨线程组获取token(彻底解决因格式token报错)

    将token设置为全局变量网上方式方法千千万,但是你就是获取token会失败,不是提示格式错误,就是提示无法获取token,没安装Jmeter的可以查看前两期教程,有详细介绍 在工作当中如果仅仅是一个 ...

  3. 【Java面试】TCP协议为什么要设计三次握手?

    一个工作5年的粉丝,最近去面试了很多公司,每次都被各种技术原理题问得语无伦次. 由于找了快1个月时间的工作,有点焦虑,来向我求助. 我能做的只是保证每天更新一个面试题,然后问他印象最深刻的一个面试题是 ...

  4. 二、shell 脚本条件测试

    目录 一.条件测试 test 格式 文件测试 文件测试常见选项 整数值比较 字符串比较 浮点数的运算 逻辑测试 二.if语句 1单分支 2双分支结构 3多分支结构 三元运算符 三.case 一.条件测 ...

  5. Canal搭建

    目录 搭建环境 MySQL环境 Canal环境 客户端 总结 需求:解决私有环境数据库的基础数据同步问题,每当中心库基础数据发生改变时,其他私有库都会增量同步 Canal主要用途是基于 MySQL 数 ...

  6. UiPath选择器之动态选择器的介绍和使用

    一.动态选择器的介绍 使用通配符, 能够替换字符串中的零个或多个字符的符号.这些在处理选择器中的动态更改的属性时非常有用. 二.动态选择器在UiPath中的使用 1.在设计库中新建一个Sequence ...

  7. MySQL十种锁,一篇文章带你全解析

    MySQL有两个核心的知识点,索引和锁.前几篇文章已经详细讲解了MySQL索引实现机制,今天再一起学习一下MySQL的锁. 1 为什么要加锁? 当多个事务并发操作同一批数据的时候,如果不加锁,就无法保 ...

  8. python小题目练习(三)

    题目:输出1!+2!+3!+--+10!的结果代码实现: # 定义一个函数来递归实现阶乘操作def cycle(num): if num == 1: return 1 else: return num ...

  9. 梯度下降算法实现原理(Gradient Descent)

    概述   梯度下降法(Gradient Descent)是一个算法,但不是像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的,所谓的通用就是很 ...

  10. NC16649 [NOIP2005]校门外的树

    NC16649 [NOIP2005]校门外的树 题目 题目描述 某校大门外长度为 \(L\) 的马路上有一排树,每两棵相邻的树之间的间隔都是 \(1\) 米.我们可以把马路看成一个数轴,马路的一端在数 ...