title: 从零玩转EasyPoi
date: 2023-01-11 13:49:25.908
updated: 2023-03-30 13:23:20.817
url: http://www.yby6.com/archives/cong-ling-wan-zhuan-easypoi
categories:
tags:
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员
就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板
语言(熟悉的表达式语法),完成以前复杂的写法
官网
基础示例
basedemo.md
测试项目: http://git.oschina.net/lemur/easypoi-test
1.设计精巧,使用简单
2.接口丰富,扩展简单
3.默认值多,write less do more
4.AbstractView 支持,web导出可以简单明了
- 导出
1.正规excel导出 (格式简单,数据量可以,5W以内吧)
注解方式: ExcelExportUtil.exportExcel(ExportParams entity, Class<?> pojoClass,Collection<?> dataSet)
2.不定多少列,但是格式依然简单数据库不大
自定义方式: ExcelExportUtil.exportExcel(ExportParams entity, List<ExcelExportEntity> entityList,Collection<?> dataSet)
3.数据量大超过5W,还在100W以内
注解方式 ExcelExportUtil.exportBigExcel(ExportParams entity, Class<?> pojoClass,IExcelExportServer server, Object queryParams)
自定义方式: ExcelExportUtil.exportBigExcel(ExportParams entity, List<ExcelExportEntity> excelParams,IExcelExportServer server, Object queryParams)
4.样式复杂,数据量尽量别大
模板导出 ExcelExportUtil.exportExcel(TemplateExportParams params, Map<String, Object> map)
5.一次导出多个风格不一致的sheet
模板导出 ExcelExportUtil.exportExcel(Map<Integer, Map<String, Object>> map,TemplateExportParams params)
6.一个模板但是要导出非常多份
模板导出 ExcelExportUtil.exportExcelClone(Map<Integer, List<Map<String, Object>>> map,TemplateExportParams params)
7.模板无法满足你的自定义,试试html
自己构造html,然后我给你转成excel ExcelXorHtmlUtil.htmlToExcel(String html, ExcelType type)
8.数据量过百万级了.放弃excel吧,csv导出
注解方式: CsvExportUtil.exportCsv(CsvExportParams params, Class<?> pojoClass, OutputStream outputStream)
自定义方式: CsvExportUtil.exportCsv(CsvExportParams params, List<ExcelExportEntity> entityList, OutputStream outputStream)
9.word导出
模板导出: WordExportUtil.exportWord07(String url, Map<String, Object> map)
10.PDF导出
模板导出: TODO
- 导入
如果想提高性能 ImportParams 的concurrentTask 可以帮助并发导入,仅单行,最小1000
excel有单个的那种特殊读取,readSingleCell 参数可以支持
1. 不需要检验,数据量不大(5W以内)
注解或者MAP: ExcelImportUtil.importExcel(File file, Class<?> pojoClass, ImportParams params)
2. 需要导入,数据量不大
注解或者MAP: ExcelImportUtil.importExcelMore(InputStream inputstream, Class<?> pojoClass, ImportParams params)
3. 数据量大了,或者你有特别多的导入操作,内存比较少,仅支持单行
SAX方式 ExcelImportUtil.importExcelBySax(InputStream inputstream, Class<?> pojoClass, ImportParams params, IReadHandler handler)
4. 数据量超过EXCEL限制,CSV读取
小数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params)
大数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params, IReadHandler readHandler)
1.导出时间XLS比XLSX快2-3倍
2.导出大小XLS是XLSX的2-3倍或者更多
3.导出需要综合网速和本地速度做考虑^~^
1.easypoi 父包--作用大家都懂得
2.easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理
3.easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
4.easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
5.sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了
1.注解,导入导出都是基于注解的,实体上做上注解,标示导出对象,同时可以做一些操作
@ExcelTarget("courseEntity")
public class CourseEntity implements java.io.Serializable {
/** 主键 */
private String id;
/** 课程名称 */
@Excel(name = "课程名称", orderNum = "1", needMerge = true)
private String name;
/** 老师主键 */
@ExcelEntity(id = "yuwen")
@ExcelVerify()
private TeacherEntity teacher;
/** 老师主键 */
@ExcelEntity(id = "shuxue")
private TeacherEntity shuxueteacher;
@ExcelCollection(name = "选课学生", orderNum = "4")
private List<StudentEntity> students;
2.基础导出
传入导出参数,导出对象,以及对象列表即可完成导出
HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
"2412312", "测试", "测试"), CourseEntity.class, list);
3.基础导出,带有索引
在到处参数设置一个值,就可以在导出列增加索引
ExportParams params = new ExportParams("2412312", "测试", "测试");
params.setAddIndex(true);
HSSFWorkbook workbook = ExcelExportUtil.exportExcel(params,
TeacherEntity.class, telist);
4.导出Map
创建类似注解的集合,即可完成Map的导出,略有麻烦
List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
entity.add(new ExcelExportEntity("姓名", "name"));
entity.add(new ExcelExportEntity("性别", "sex"));
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map;
for (int i = 0; i < 10; i++) {
map = new HashMap<String, String>();
map.put("name", "1" + i);
map.put("sex", "2" + i);
list.add(map);
}
HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
"测试", "测试"), entity, list);
5.模板导出
根据模板配置,完成对应导出
TemplateExportParams params = new TemplateExportParams();
params.setHeadingRows(2);
params.setHeadingStartRow(2);
Map<String,Object> map = new HashMap<String, Object>();
map.put("year", "2013");
map.put("sunCourses", list.size());
Map<String,Object> obj = new HashMap<String, Object>();
map.put("obj", obj);
obj.put("name", list.size());
params.setTemplateUrl("org/jeecgframework/poi/excel/doc/exportTemp.xls");
Workbook book = ExcelExportUtil.exportExcel(params, CourseEntity.class, list,
map);
6.导入
设置导入参数,传入文件或者流,即可获得相应的list
ImportParams params = new ImportParams();
params.setTitleRows(2);
params.setHeadRows(2);
//params.setSheetNum(9);
params.setNeedSave(true);
long start = new Date().getTime();
List<CourseEntity> list = ExcelImportUtil.importExcel(new File(
"d:/tt.xls"), CourseEntity.class, params);
7.和spring mvc的无缝融合
简单几句话,Excel导出搞定
@RequestMapping(params = "exportXls")
public String exportXls(CourseEntity course,HttpServletRequest request,HttpServletResponse response
, DataGrid dataGrid,ModelMap map) {
CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid);
org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap());
List<CourseEntity> courses = this.courseService.getListByCriteriaQuery(cq,false);
map.put(NormalExcelConstants.FILE_NAME,"用户信息");
map.put(NormalExcelConstants.CLASS,CourseEntity.class);
map.put(NormalExcelConstants.PARAMS,new ExportParams("课程列表", "导出人:Jeecg",
"导出信息"));
map.put(NormalExcelConstants.DATA_LIST,courses);
return NormalExcelConstants.JEECG_EXCEL_VIEW;
}
8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口
@Excel(name = "Email", width = 25)
@Max(value = 15,message = "max 最大值不能超过15")
private int email;
/**
* 手机号
*/
@Excel(name = "Mobile", width = 20)
@NotNull
private String mobile;
ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File(
"d:/tt.xls"), ExcelVerifyEntity.class, params);
for (int i = 0; i < result.getList().size(); i++) {
System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i)));
}
9.导入Map
设置导入参数,传入文件或者流,即可获得相应的list,自定义Key,需要实现IExcelDataHandler接口
ImportParams params = new ImportParams();
List<Map<String,Object>> list = ExcelImportUtil.importExcel(new File(
"d:/tt.xls"), Map.class, params);
10.大数据量Excel导出
exportBigExcel 的方法 ,最后可以关闭closeExportBigExcel 也可以不关闭
11.如果View不起作用,已经发现被其他View处理掉的情况,使用下面这个,进行了统一封装,相同的效果
PoiBaseView
public static void render(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response, String viewName) {
PoiBaseView view = null;
if (BigExcelConstants.BIG_EXCEL_VIEW.equals(viewName)) {
view = new BigExcelExportView();
} else if (MapExcelConstants.JEECG_MAP_EXCEL_VIEW.equals(viewName)) {
view = new JeecgMapExcelView();
} else if (NormalExcelConstants.JEECG_EXCEL_VIEW.equals(viewName)) {
view = new JeecgSingleExcelView();
} else if (TemplateExcelConstants.JEECG_TEMPLATE_EXCEL_VIEW.equals(viewName)) {
view = new JeecgTemplateExcelView();
} else if (MapExcelGraphConstants.MAP_GRAPH_EXCEL_VIEW.equals(viewName)) {
view = new MapGraphExcelView();
}
try {
view.renderMergedOutputModel(model, request, response);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
// Demo
@RequestMapping(params = "exportXls")
public void exportXls(CourseEntity course,HttpServletRequest request,HttpServletResponse response
, DataGrid dataGrid,ModelMap map) {
CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid);
org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap());
List<CourseEntity> courses = this.courseService.getListByCriteriaQuery(cq,false);
map.put(NormalExcelConstants.FILE_NAME,"用户信息");
map.put(NormalExcelConstants.CLASS,CourseEntity.class);
map.put(NormalExcelConstants.PARAMS,new ExportParams("课程列表", "导出人:Jeecg",
"导出信息"));
map.put(NormalExcelConstants.DATA_LIST,courses);
PoiBaseView.render(map,request,response,NormalExcelConstants.JEECG_EXCEL_VIEW);
}
“我最好的进球永远是下一个。”——球王贝利“下一代”也是ICT领域的常用词,但并非谁都能成为“下一代”的引领者,除了实力与影响力外,还须经受住时间的检验。按照地质和古生物学的标准,断代方法有两种:一是相对法,即利用地层和生物层序律及切割律来确定年代先后;二是绝对法,以岩石中某些放射性元素的蜕变规律测算地层年龄。判断ICT基础设施是否进入“下一代”,或可以此为参照。一方面,透过诞生背景、技术演进、产业生态等横截面,寻找代际之间的核心差别;另一方面,从历史纵深发掘明显的代际符号,以全生命周期的视角探索更多可能。作为云时代ICT基础设施的翘楚,数据中心也进入了“蜕变纪”。在“碳中和”大背景下,数据中心能否完成真正意义上的代际跃迁?2022年5月26日,以“智简DC,绿建未来”为主题,华为下一代数据中心发布会在东莞松山湖举办。华为数据中心能源军团凝聚行业专家智慧结晶,面向全球发布下一代数据中心理念及全新供电解决方案电力模块3.0。这个“下一代”,似乎有些与众不同。环境巨变,跃迁时机已到回顾人类现代化发展历程,已完成从蒸汽时代、电气时代到信息时代的三次工业革命。这三次革命主要依赖化石能源,经济快
-前言-Elasticsearch是一个实时的分布式搜索分析引擎,它的底层是构建在Lucene之上的。简单来说是通过扩展Lucene的搜索能力,使其具有分布式的功能。ES通常会和其它两个开源组件Logstash(日志采集)和Kibana(仪表盘)一起提供端到端的日志/搜索分析的功能,常常被简称为ELK。-关于OLAP利器-Clickhouse是俄罗斯搜索巨头Yandex开发的面向列式存储的关系型数据库。ClickHouse是过去两年中OLAP领域中最热门的,并于2016年开源。 ES是最为流行的大数据日志和搜索解决方案,但是近几年来,它的江湖地位受到了一些挑战,许多公司已经开始把自己的日志解决方案从ES迁移到了Clickhouse,这里就包括:携程,快手等公司。-架构和设计的对比-ES的底层是Lucene,主要是要解决搜索的问题。搜索是大数据领域要解决的一个常见的问题,就是在海量的数据量要如何按照条件找到需要的数据。搜索的核心技术是倒排索引和布隆过滤器。 ES通过分布式技术,利用分片与副本机制,直接解决了集群下搜索性能与高可用的问题。ElasticSearch是为分布式设计的,有很好的
我们前边利用六篇篇幅介绍了会议管理小程序的各项功能,今天我们先复习一下我们已经完成的功能:首页在这里插入图片描述首页我们分为两个区域,上边是快捷功能的入口,包含会员登记、会员充值、会员消费、发票申请四个功能。下边是导航区域,包含首页及会员功能。会员登记在这里插入图片描述可以录入会员的基本信息,并且将信息提交至数据库中会员充值在这里插入图片描述在这里插入图片描述可以给会员进行充值会员消费在这里插入图片描述在这里插入图片描述可以记录会员的消费情况发票申请在这里插入图片描述可以记录发票的信息会员查询在这里插入图片描述在这里插入图片描述可以查询会员的详情信息关于学习方法官方群里有小伙伴吐槽文档比较少,学习内容少。其实在我看来,如果想跟一个新技术或者新产品,自学是非常有必要的。那如何自学呢?看官方文档和官方视频是必要的,但是如果只是看的话容易造成眼高手低。看了感觉都会了,但是一旦自己动手做,好像又啥都不会。我的建议是带着问题去学习,比如像我这个教程一样,我就是观察到日常中的生活场景,然后利用微搭低代码去实现这个场景。那做什么呢?有时候我们刚开始开发,尤其要开发一个产品的时候,往往是觉得无从下手。
DDoS是网络犯罪领域的老生常谈,是一个严重的问题,需要采取有效的防御DDoS措施。最重要的是,它正在迅速发展。其中一些突袭行动依靠恶意软件、物联网僵尸网络和开源网络压力测试框架来扩大其影响范围。更糟糕的是,一些新颖的攻击增加了敲诈。透彻了解攻击原理有助于提升防御DDoS效果,你知道多少呢?分布式拒绝服务(DDoS)攻击现象于20世纪90年代中期首次出现,此后经历了巨大的演变。在其诞生之初,这主要是黑客行动主义者的特权,他们将主要互联网服务下线,以此作为抗议网络审查和有争议的政治举措的标志。DDoS攻击不仅非常复杂和有影响力,而且正在形成一个巨大的网络犯罪经济体,其运营商越来越善于将他们的恶作剧货币化,最新加入到他们的类型是所谓的勒索DDoS。它的逻辑是对一个组织发动破坏性的攻击,然后要求为终止该组织支付费用。乍一看,DDoS背后的想法似乎很简单:用超出其处理能力的数据包淹没网络或web服务器。在网络安全问题上,意识是成功的一半。如果您知道组织的IT基础架构中可能被DDoS参与者利用的薄弱环节,您可以确定防御DDoS的优先级,至少可以将遇到单点故障场景的风险降至最低。恶意参与者的手册中
数据结构与算法系列1之数组介绍与动态数组实现数组基本概念介绍本节讲解顺序1数组的概念 2数组的定义 2.1动态初始化 2.2静态初始化 3数组中的内存划分 4两个数组指向一个地址 5两个常见问题1数组的概念数组是用来存储固定大小的同类型元素。2数组的定义2.1动态初始化1publicclassTest{ 2publicstaticvoidmain(String[]args){ 3int[]arr=newint[100]; 4} 5}复制arr是数组名称100是数组的大小2.2静态初始化publicclassTest{ publicstaticvoidmain(String[]args){ int[]arr=newint[]{1,2}; } }复制该数组大小即为23内存角度解析数组首先简单等等介绍一下java中的内存划分Java内存主要划分为五部分1栈(stack):存放的都是方法中的局部变量,方法的运行一定要在栈中运行, 局部变量:方法的参数,或者是方法{}内部的变量 作用域:一旦超出作用域,立刻从内存中消失2堆(Heap):凡是new出来的东西都在堆里 堆中的东西都有地址值:地址值为
当你购买了一台Linux服务器,想将Web应用代码部署到服务器上,并在更新代码版本时能够重新部署,该怎么做?首先你需要通过SSH远程连接到服务器,运行指令安装运行环境和Web服务器(前往配置文件的目录编辑文件),另外还需要打开防火墙、加强SSH配置,创建账户等初始化操作。 在更新版本后,你还要再次部署代码包并重启Web应用。在后续的服务器日常运维中,你更要花费大量时间测试和验证,尤其在出现问题后快速定位问题。在以上一系列操作中,你都需要执行海量命令并修改大量文件。如何才能优雅又高效地一键执行重复命令、集中维护配置文件,并在购买多台Linux服务器时完成批量且一致性的配置与部署?这个时候,腾讯云自动化助手(TencentCloudAutomationTools,TAT)就派上用场了。腾讯云自动化助手是云服务器的原生运维部署工具。您无需远程连接实例,自动化助手即可自动批量执行Shell命令,完成运行自动化运维脚本、轮询进程、安装/卸载软件、更新应用及安装补丁等任务。简单来说,自动化助手=脚本+命令集中保存+一键执行+批量操作。自动化助手能够在发挥脚本「神奇」作用的同时,还能将所有使用过
与WordPress的美妙相遇折折腾腾搞了几年的个人博客,东搞西搞,搞来搞去也不满意。最终痛定思痛,想彻底解决这个问题,最后筛选了一些建站工具后选择了WordPress,可能是因为喜欢他的风格吧。安装问题让我万万没有想到的是,这个在我看来、和在``WordPress``看来简单的小东西的安装就卡住了。PHP环境首先就是安装环境的要求话说这个鄙视链底端(无心挑衅,诚我不欺,瑟瑟发抖,婀娜多姿,如有得罪,在下赔罪,多谢多谢)的语言我曾经只是看过同事一番操作,没有亲自上手写过。而且这个WordPress又是基于这个语言构建的,着实有点不会了。所以没办法,我决定我预计给了自己1个小时时间想要速成PHP开发,现在是2020年10月18日11:04:11,一小时后见。等等第一次下载PHP的包,不清楚情况,检查了一下网速。此时我只有默默的等他下载完成。趁着这个机会,赶紧去看看WordPress的主题吧。30分钟终于下好了,那么开始吧。windows环境我现在像个小孩子拿到一个玩具一样盯着PHP的包看我试着解压它发现了我想要的东西README.md,因为现在在window环境,所以找到了关键的信息我顺
很久没有发过文章了,并不是账号忘记了,而是自己变懒了,还有就是现在的技术文,写得再好都没啥用,都是没多少人看。还有那些看了我的文章的然后来加我微信的,一看文章什么的点个好看都没,直接拒绝,和那些口口声声说对自己有多大帮助的也是这样,所以就懒了,直接在自己小本子上记些简要记录就行了,反正也是自己看,不需要多好看。 所以这次发个记录好了,不说任何代码这些,看官们随意。 123ua是从一个coll***.js文件加密的,看过的人应该都知道,自从122更新之后,里面不止有恐怖的控制流混淆,还有逗号表达式,逗号表达式加了之后,不将这些逗号表达式变形,是很难调试的,基本也调试不了,我这里将代码转成ast,然后转换代码格式来还原的,如需了解ast的自己百度搜就行了,这里就不多说了。 我还原了条件表达式、逗号表达式、字符串相加这三个,其他的由于个人技术有限,还原不了。还原之后,就可以随便调试了,里面也没有debugger,所以直接使用fiddler的重定向替换原文件,就可以直接在网站上调试了。这个才是第一步,之后的困难才是重重的。由于这个如果还原代码成非控制流的话,需要很多时间和精力,所以我为了方便,
两数之和 0.说在前面又到了新的一周,我们这周的第一篇LeetCode,有关链表话题,在python中如何操作链表,定义链表呢?有关这个问题,大家可以留言,将情况反馈,我根据情况发文,本来惯例周二发文,实际上是每周一刷题,但是由于时间安排问题放在了周二,所以以后还是惯例周二,但是本周二被安排了,所以提前发文LeetCode!下面一起来看本次刷题,两数之和!!!1.两数之和问题给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储单位数字。如果,我们将这两个数起来相加起来,则会返回出一个新的链表来表示它们的和。您可以假设除了数字0之外,这两个数都不会以0开头。示例:输入:(2->4->3)+(5->6->4) 输出:7->0->8 原因:342+465=807 复制2.思路分析【方法一】将l1链表的数取出,组成一个数,l2同理,最终求和,将求和结果循环得出每个节点的值,然后链表连接即可!!!【方法二】边循环max(len(l1),len(l1)),边求和,边插入新链表数!!!3.实现方法【方法一
数据库命令规范所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)数据库对象的命名要能做到见名识意,并且最后不要超过32个字符临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)数据库基本设计规范1.所有表必须使用Innodb存储引擎没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5.5之前默认使用Myisam,5.6以后默认的为Innodb)。Innodb支持事务,支持行级锁,更好的恢复性,高并发下性能更好。2.数据库和表的字符集统一使用UTF8兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储emoji表情的需要,字符集需要采用utf8mb4字符集。
一、数据库介绍1、数据库服务器2、数据库:按照用途及业务,分类使用3、数据表:不同数据4、数据字段:也叫数据列,英文5、数据行:格式二、数据定义语言数据定义及展示创建显示删除使用库createdatabasephp;showdatabases;dropdatabasephp;usephp;表createtableuse(,));showtables;droptableuser;字段descuser;showcolumnsfromuser;describedb;字段操作命令增加altertableuseraddfirst/afterxxx;删除altertableuserdropbbb;修改altertableusermodifyusernamevarchar(20);altertableusermodifyoldnew;altertableoldrenamenew;altertableuserchangeoldnew;数据类型字段整型tinyint smallint mediumint bigint浮点型float double decimal字符型char varchar
一一场以大数据为核心的智能盛宴时下仿佛大家都在谈人工智能,就像当年人人都在谈大数据一样。在不同场合上,阿里巴巴的马云、百度的李彦宏及腾讯的马化腾分别谈过自己对人工智能的看法和观点。这种对话有点儿像金庸小说中的华山论剑。到底是气宗(大数据)还是剑宗(人工智能)更有战略意义?我认为,两者是相辅相成的。经历了互联网20年的发展,我们已经积累了足够多的数据去驱动一场“智能盛宴”,以大数据为核心的人工智能渐露端倪。有一天晚上准备睡觉时,听到隔壁传来女儿跟苹果智能语音助手Siri对话的声音。我太太问我,这样正常吗?我告诉她不用担心,这是目前的趋势。根据不久前美国“用户普及率调查”的结果,语音助手的使用已经达到引爆点,并在走向大规模普及的阶段。前段时间,我在美国旧金山就拜访了SemanticMachines的创始人兼CEO丹·罗斯(DanRoth),这家公司的成员很多都是Siri和Echo的幕后功臣。如今,罗斯领导着一个汇集了自然语言处理、语义理解、会话计算等领域专家的顶级团队,目标是攻破人机对话领域这个老大难的题目。罗斯把他们正在研发的革命性技术称为对话式人工智能(ConversationalAI
(function(window,undefined){ varjQuery=... ... window.jQuery=window.$=jQuery; })(window); 整个代码包裹在一个立即执行匿名函数内。 这样写的优点: 1.通过写立即执行匿名函数,这样不会干扰jQuery内部的代码,也不会破坏和污染全局变量; 2.把window当做参数传进去: (1)能缓存window对象,使其变成局部变量,可以缩短查找作用域链,加快查找速度; (2)使压缩比提高,方便压缩优化; 3.把undefined当做变量传进去,但是调用的时候不传参: (1)能防止undefined在低版本浏览器(ie8及以下)被重写; (2)能缓存undefined,可以缩短查找undefined的作用域链; (3)提高压缩比
原文:http://my.oschina.net/haogrgr/blog/323079?p=1 /*======================================================================== *Bootstrap:modal.jsv3.2.0 *http://getbootstrap.com/javascript/#modals *======================================================================== *Copyright2011-2014Twitter,Inc. *LicensedunderMIT(https://github.com/twbs/bootstrap/blob/master/LICENSE) *========================================================================*/ //这里的+function($){}(jQuery)和(function($){}
关于ArrayList的源码关注点 1.从底层数据结构,扩容策略2.ArrayList的增删改查3.特殊处理重点关注4.遍历的速度,随机访问和iterator访问效率对比 1.从底层数据结构,扩容策略 对于第一个问题,底层即时一个object的数组,用来存放动态数据: transientObject[]elementData;默认初始容量大小是10个,注意这里有个坑不是一开始就是10个,而是当进行add操作的时候,会默认修改为10个:privatestaticfinalintDEFAULT_CAPACITY=10; 源码中进行初始化的时候: 而我们的DEFAULTCAPACITY_EMPTY_ELEMENTDATA这个数据是,也就是说只进行new操作的时候,我们是给了一个空的数组大小是0长度是0,大小是0PrivatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA={}; 这里源码中有一段代码: collection.toArray()應該等同
随便打开一个MicrosoftVisualStudio,新建一个WinForms项目,从下面列表中随便选择一个NET框架。 net35;net40;net45;net451;net452;net46;net461;net462;net47;net471;net472;net48; netstandard2.0;netcoreapp3.1; net5.0;net6.0;复制 创建完窗口后,切换到【程序包管理控制台】,输入下面命令并回车: Install-PackagePaddleOCRSharp-Version1.3.1复制 完成PaddleOCRSharp的依赖包安装。 在窗口界面拖放一个按钮,并双击,在按钮的点击事件中,输入以下代码: OpenFileDialogofd=newOpenFileDialog(); ofd.Filter="*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png"; if(ofd.ShowDialog()!=DialogResult.OK)return; varimagebyte=File.ReadAllBytes(
原题:Problem-6983(hdu.edu.cn) 题意:将一段1~n的区间二分成线段树,当区间的长度r-l+1<=k时,停止二分,统计线段树节点个数。 分析:对区间长度记忆化搜索 题解: #include<bits/stdc++.h> #definelllonglong usingnamespacestd; lln,k; map<ll,ll>tree; llbuild(lln)//n表示区间长度 { //当tree.find(x)==tree.end()说明原本map中不存在x这个元素 if(tree.find(n)!=tree.end())returntree[n];//之前搜过这个长度 if(n<=k)returntree[n]=1;//区间长度<=k,则该节点为末尾子节点,记节点个数为1 returntree[n]=build(n/2)+build(n-n/2)+1;//该长度既没搜过,又>k,因此需要递归求得 //该区间长度覆盖节点个数=二分两边的子区间节点个数+ } intmain() { intT; scanf("