记录java刷题的一个大坑,ArrayList和LinkedList效率差别
6235. 逐层排序二叉树所需的最少操作数目
层次遍历,对每一层,按照排序的结果对数组进行交换,记录交换次数即可。
这是第319场周赛T3,这题被卡了好久,看了题解以后发现和我的思路一样,但我的代码就是有两个测试用例超时。
经过反复提交测试,发现是初始化List时用ArrayList和LinkedList的区别。
class Solution {
public int minimumOperations(TreeNode root) {
//层次遍历结果
List<List<Integer>> list = levelOrder(root);
int res = 0;
//加上每层按照排序结果交换的次数
for(int i = 0; i < list.size(); i++){
res += getMinswap(list.get(i));
}
return res;
}
List<List<Integer>> levelOrder(TreeNode root){
List<List<Integer>> list = new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
int size = queue.size();
List<Integer> tmp = new LinkedList<>();
for(int i = 0; i < size; i++){
TreeNode now = queue.poll();
tmp.add(now.val);
if(now.left != null) queue.offer(now.left);
if(now.right != null) queue.offer(now.right);
}
list.add(tmp);
}
return list;
}
int getMinswap(List<Integer> nums){
if(nums.size() == 1) return 0;
int n = nums.size();
int res = 0;
List<Integer> sortedNums = new LinkedList<>(nums);
Collections.sort(sortedNums);
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < sortedNums.size(); i++){
map.put(sortedNums.get(i), i);
}
for(int i = 0; i < n; ){
if(sortedNums.get(i).equals(nums.get(i))){
i++;
continue;
}
Collections.swap(nums, i, map.get(nums.get(i)));
res++;
}
return res;
}
}
class Solution {
public int minimumOperations(TreeNode root) {
//层次遍历结果
List<List<Integer>> list = levelOrder(root);
int res = 0;
//加上每层按照排序结果交换的次数
for(int i = 0; i < list.size(); i++){
res += getMinswap(list.get(i));
}
return res;
}
List<List<Integer>> levelOrder(TreeNode root){
List<List<Integer>> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
int size = queue.size();
List<Integer> tmp = new ArrayList<>();
for(int i = 0; i < size; i++){
TreeNode now = queue.poll();
tmp.add(now.val);
if(now.left != null) queue.offer(now.left);
if(now.right != null) queue.offer(now.right);
}
list.add(tmp);
}
return list;
}
int getMinswap(List<Integer> nums){
if(nums.size() == 1) return 0;
int n = nums.size();
int res = 0;
List<Integer> sortedNums = new ArrayList<>(nums);
Collections.sort(sortedNums);
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < sortedNums.size(); i++){
map.put(sortedNums.get(i), i);
}
for(int i = 0; i < n; ){
if(sortedNums.get(i).equals(nums.get(i))){
i++;
continue;
}
Collections.swap(nums, i, map.get(nums.get(i)));
res++;
}
return res;
}
}
把我原来的LinkedList改成ArrayList就过了。
ArrayList和LinkedList有什么区别:
大部分应该选择ArrayList,因为很多时候我们都要遍历数组,此时就要调用get方法访问元素,对于随机访问,ArrayList比LinkedList快。
由于LinkList能够高效的进行插入删除,在任意位置插入操作对应add(int index, E element)
,删除操作对应remove(int index)
,所以遇到这两种操作比较多的时候应该用LinkList。这种情况在我刷题的过程中遇到得比较少。
Collections.sort()内部是归并排序,下面对ArrayList和LinkedList实现的List做一个简单的排序效率测试。
import java.util.*;
public class Main {
public static void main(String[] args) {
int count = 10000000;
List<Integer> listArray = new ArrayList<>();
List<Integer> listLinked = new LinkedList<>();
Random random = new Random();
//生成count个随机值
for (int i = 0; i < count; i++) {
int rand = random.nextInt();
listArray.add(rand);
listLinked.add(rand);
}
//开始计时
long startTime1 = System.currentTimeMillis();
//对ArrayList排序
Collections.sort(listArray);
long endTime1 = System.currentTimeMillis();
long usedTime1 = (endTime1 - startTime1);
//开始计时
long startTime2 = System.currentTimeMillis();
//对LinkedList排序
Collections.sort(listLinked);
long endTime2 = System.currentTimeMillis();
long usedTime2 = (endTime2 - startTime2);
//打印排序时间
System.out.println("ArrayList排序用时:" + usedTime1);
System.out.println("LinkedList排序用时:" + usedTime2);
}
}
单从排序效率来看LinkList是比ArrayList高的,然而根据我上面那道题的例子,里面也有用到排序,当我把排序的那个List改为LinkList时仍然无法通过,应该是排完序之后又对数组进行了遍历,而遍历ArrayList是快的。
import java.util.*;
public class Main {
public static void main(String[] args) {
int count = 100000;
List<Integer> listArray = new ArrayList<>();
List<Integer> listLinked = new LinkedList<>();
Random random = new Random();
//生成count个随机值
for (int i = 0; i < count; i++) {
int rand = random.nextInt();
listArray.add(rand);
listLinked.add(rand);
}
//开始计时
long startTime1 = System.currentTimeMillis();
//对ArrayList遍历
for(int i = 0; i < listArray.size(); i++){
int a = listArray.get(i);
}
long endTime1 = System.currentTimeMillis();
long usedTime1 = (endTime1 - startTime1);
//开始计时
long startTime2 = System.currentTimeMillis();
//对LinkedList遍历
for(int i = 0; i < listLinked.size(); i++){
int a = listLinked.get(i);
}
long endTime2 = System.currentTimeMillis();
long usedTime2 = (endTime2 - startTime2);
//打印遍历时间
System.out.println("ArrayList遍历用时:" + usedTime1);
System.out.println("LinkedList遍历用时:" + usedTime2);
}
}
由此可见,ArrayList的遍历效率比LinkList高,而且超出LinkList的部分大于LinkList排序超出ArrayList的部分。因此在排序和遍历操作都存在的情况,还是应该选择ArrayList。
刷题的时候首选ArrayList。遇到add(int index, E element)
和remove(int index)
操作频繁的时候,再改用LinkList。
转载:https://vanmieghem.io/blueprint-for-evading-edr-in-2022/Shellcode加密减少熵逃离(本地)反病毒沙箱导入表混淆禁用Windows事件跟踪(ETW)规避常见的恶意API调用模式直接系统调用和规避“系统调用标记”拆除挂钩ntdll.dll欺骗线程调用堆栈信标的内存加密自定义反射加载器可扩展配置文件中的OpSec配置1、Shellcode加密让我们从一个基本但重要的话题开始,静态shellcode混淆。在我的加载程序中,我利用了XOR或RC4加密算法,因为它易于实现并且不会留下大量加载程序执行的加密活动的外部指标。用于混淆shellcode静态签名的AES加密会在二进制文件的导入地址表中留下痕迹,这增加了怀疑。在此加载程序的早期版本中,我已经让WindowsDefender专门触发了AES解密函数(例如CryptDecrypt、等)。CryptHashDataCryptDeriveKey2.减少熵许多AV/EDR解决方案在评估未知二进制时考虑二进制熵。由于我们正在加密shellcode,我们的二进制文件的熵相当高,这清楚地表
大家好!今天跟大家分享的文献是2021年5月发表在MolecularTherapy:NucleicAcid(IF=7.032)杂志上的一篇文章。本研究系统分析了ccRCC患者的铁死亡情况,为铁死亡临床特征和作用提供潜在作用。题目:Genomicanalysisuncoversprognosticandimmunogeniccharacteristicsofferroptosisforclearcellrenalcellcarcinoma基因组分析揭示铁死亡对肾透明细胞癌预后和免疫特征生信分析定制服务也可直接添加小编微信:keyan-zhishi2沟通摘要本研究系统的研究了铁死亡在肾透明细胞癌(ccRCC)中的模式,以及铁死亡与肿瘤微环境(TME)的相互作用。根据57个铁死亡相关基因(FRGs)的表达水平,构建三个铁死亡模式,这三种模式的预后和免疫细胞浸润不同。铁死亡打分较高与预后较差,T细胞浸润增加,免疫和基质打分较高,TMB较高和抗CTLA4免疫治疗反应较强有关。铁死亡打分较低与肿瘤纯度较高,氨基酸和脂肪酸代谢途径显著相关。铁死亡可以作为独立的预后因素。流程图结果1.数据的获取和整理
Podtnl(https://github.com/narendranathreddythota/podtnl)是一个不通过暴露KubernetesService服务也可以在线访问Pod的一个功能强大的CLI工具。使用非常简单,特别是在应用开发阶段非常有用,完全不用担心有没有创建Ingress、LoadBalancer等资源。Podtnl使用了两个主要的概念:端口转发和隧道。直接下载GitHub仓库上Release的二进制文件即可:$wgethttps://github.com/narendranathreddythota/podtnl/releases/download/1.0/podtnl $chmod+xpodtnl $mvpodtnl/usr/local/bin/复制要使用Podtnl需要提供一个隧道,目前Podtnl只支持Ngrok作为隧道提供商,所以需要提前安装配置好Ngrok,可以通过地址https://dashboard.ngrok.com/get-started/setup进行配置。当Podtnl和Ngrok都配置好过后,即可使用,Podtnl可以使用的一些命令如下所
titanic乘客的生存预测是数据挖掘的入门级实例,根据船上乘客的多维特征预测事故发生后乘客的生还几率,属于监督学习中典型的分类问题。本文结合对数据挖掘流程的理解和经典案列,呈现数据挖掘过程。 该模型属于监督学习,需要训练集和数据集: 数据集地址:https://www.kaggle.com/omarelgabry/titanic/a-journey-through-titanic什么是数据挖掘数据分析/挖掘是以概率论、线性代数、统计学、信息论为基础,根据之前接触到的数据挖掘流程,可定义为:数据准备-->数据探索-->数据预处理-->特征工程-->模型建立-->模型评估,其中数据探索、数据预处理、特征工程针对某一属性同时进行。构建模型的前几个步骤占数据挖掘工作量的80%以上,构建模型和模型评估几行代码可以搞定,若是数据质量无非保证,模型质量无从谈起;数据挖掘常用工具包工具使用anaconda自带的notebook,首先引入pandas的DataFrame对象,numpy包,matplotlib包,seaborn包;importpandasaspd from
插件推荐推荐Vue插件:Vue.jsdevtools基本操作v-bind<spantitle="dream">学好Vue</span>复制<spanv-bind:title="dream">学好Vue</span>复制data(){ return{ message:'HelloPython', name:'zhongxin', dream:'小目标' } }复制可以使用插件进行修改绑定的内容v-if和v-show<pv-if="isNotFlag">嘟嘟嘟</p>复制data(){ return{ message:'HelloPython', name:'zhongxin', dream:'小目标', isNotFlag:false, } }复制当isNotFlag是false的时候不显示,当isNotFlag是true的时候显示<
转移性学习对阿尔茨海默病分类的研究原文链接 摘要 将cv用于研究需要大量的训练图片,同时需要对深层网络的体系结构进行仔细优化。该研究尝试用转移学习来解决这些问题,使用从大基准数据集组成的自然图像得到的预训练权重来初始化最先进的VGG和Inception结构,使用少量的MRI图像来重新训练全连接层。采用图像熵选择最翔实的切片训练,通过对OASISMRI数据集的实验,他们发现,在训练规模比现有技术小近10倍的情况下,他们的性能与现有的基于深层学习的方法相当,甚至更好 介绍 AD的早期诊断可以通过机器学习自动分析MRI图像来实现。从头开始训练一个网络需要大量的资源并且可能结果还不够好,这时候可以选择使用微调一个深度网络来进行转移学习而不是重新训练的方法可能会更好。该研究使用VGG16和Inception两个流行的CNN架构来进行转移学习。结果表明,尽管架构是在不同的领域进行的训练,但是当智能地选择训练数据时,预训练权值对AD诊断仍然具有很好的泛化能力 由于研究的目标是在小训练集上测试转移学习的鲁棒性,因此仅仅随机选择训练数据可能无法为其提供表示MRI足够结构变化的数据集。所以,他们选择通过图
rate评分组件一般都用javascript写,所以这次将是一个全新的尝试,用css实现一个rate评分❗核心代码也就三行01效果图02原理主要是借助radio单选框,梳理如下:去找个好看的iconfont;借用5个radio单选框,把默认样式都去掉,显示默认的星星;用checked伪类监听用户选中✅,由默认的星星变成高亮的星星;然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;把5个radio单选框反向排列❗;03代码这是我事先生成好的iconfont:一个很简洁的布局:先把默认的星星显示出来://去掉默认样式input{-webkit-appearance:none;border:none;outline:none;cursor:pointer;}.rate-content{$main:#ffa822;//高亮颜色$basic:#999;//默认颜色//单个星星input[name="rate"]{font-family:"iconfont";//之前引入的iconfont字体font-size:30px;padding-right:1
增强现实应用程序开发增强现实扩展了现实世界环境的边界,为业务创造了新的机会。根据Digi-Capital的研究,到2023年,AR的收入可能达到700-75亿美元,但VR的收入可能在100-150亿美元左右。它的受欢迎程度和进一步增长的预测必须激励企业家考虑AR应用程序开发来创建数字业务。如果您曾考虑过这种可能性,那么您已经考虑过增强现实应用开发成本。增强现实的想法很成熟,因为它是在90年代开发的,但随着计算机的兴起,增强现实应用已经变得普遍-对于企业和用户而言。增强现实技术是一种在真实世界对象上部署虚拟图像的技术。它是CG图像与现实世界相结合的叠加。通过从设备,相机或智能眼镜输入视觉数据,同时发生叠加。因此,用户可以在智能手机,平板电脑,电视或其他连接设备的屏幕上看到现实物体和虚拟物品的组合。AR如何工作:-相机创建真实物体的镜头,为放置增强物体的场景提供基础。-注册过程计算出如何在图片中放置AR对象。-该组合图像被发送到用户可以看到的设备。增强现实与虚拟现实应用程序开发有什么区别?尽管增强现实和虚拟现实应用程序开发之间存在差异,但这两个术语经常被混淆。AR应用程序可将2D或3D图形
在瞬息万变的前端开发世界中,很难找到一个真正有意义的概念,并且将其清晰明了的向广大人民群众普及。把目光投向CSS,一个重大转折就是CSS预处理器的出现(在工具方面来看),其中,Sass应该是最为著名的一个。此外,还有PostCSS,它和Sass略有不同,但是殊途同归——都是用浏览器不能解析的语法编写,并且最终编译成浏览器能够理解的语法。现在,又有一位新的成员出现了,它就是CSS模块。本文就将介绍CSS模块化的诸多优点,以及如何编写模块化的CSS。什么是CSS模块首先,让我们从官方文档入手:ACSSModuleisaCSSfileinwhichallclassnamesandanimationnamesarescopedlocallybydefault.CSS模块就是所有的类名都只有局部作用域的CSS文件。事实稍微有一些复杂。由于类名需要默认具有局部作用域,这就涉及到一些初始设置、一个编译过程,以及其他一些难以琢磨的东西。但是最终,我们会为CSS模块化带来的好处而开心:CCS模块将作用域限制于组件中,从而避免了全局作用域的问题。我们再也不用操心为组件寻找一个好的命名了,因为编译过程已经帮
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/53453958 前段时间写了一篇博客使用CoordinatorLayout打造各种炫酷的效果,主要介绍了APPBarLayout和CollapsingToolbarLayout的基本用法,AppBarLayout主要用来实现在滚动的时候ToolBar的隐藏于展示,CollapsingToolbarLayout主要用来实现parallax和pin等效果。如果你对CoordinatorLayout还不了解的话,请先阅读这篇文章。写作思路CoordinatorLayoutBehavior简介怎样自定义Behavior仿知乎效果自定义Behavior的实现自定义Behavior两种方法的对比FloatActionButton自定义Behavior效果的实现题外话今天就来讲解怎样通过自定义behavior来实现各种炫酷的效果,效果图如下下面让我们一起来看一下怎样实现仿知乎的效果老规矩,先看代码<?xmlversion=&qu
Java的四种内部类包括如下:成员内部类静态内部类局部内部类匿名内部类1.成员内部类:作为类的成员,存在于某个类的内部。 成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。publicclassOutter1{ privatestaticinta=1; privateintb=3; privatestaticvoidtest1(){ System.out.println("调用外部类的静态方法"); } privatevoidtest2(){ System.out.println("调用外部类的非静态方法"); } classInner{ voidtest(){ System.out.println("在成员内部类的方法中"); test1();//调用外部类的静态方法 test2();//调用外部类的非静态方法 System.out.println(a+b);//访问外部类的静态成员变量和非静态成员变量 } } publicstaticvoidmain(String[]args
作者简介:满明磊,山东科技大学本科生,研究方向SDN随着SDN控制平面不断扩展,单一的控制器很难满足需求,这时候部署多个控制器是势在必行的,一旦部署了多控制器,如何使它们协同工作就成了亟待解决的问题。Ryu是基于Python的控制器,不像java类型的控制器一样带有集群功能,不过好在比java方便,本篇文章就介绍一下如何利用C/S架构进行多控制器之间的通信。设计原理因为控制器一旦运行,就要占用一个TCP端口,如果跟其他控制器直接通信,需要再占用其他端口,如果控制器数量很多,那么控制器全互联的代价很大,配置也很不方便。为了解决这个问题,我们设置一个第三方服务器,其他的控制器都与服务器建立连接,把信息发送给服务器,这样既能够让控制器专注于控制网络,也使得网络层次更加分明。每个控制器相当于一个客户端,自己持有自己那部分网络的信息,同时为了获得其他网络的信息而不断与服务器进行交互。为了创建一个高效方便的服务器,我们使用gevent的StreamServer模块。gevent是一个基于协同程序的Python网络库,它以greenlet为核心,提供了非常高的并发性能,简单的说就是可以让多线程更加高
本教程总共5篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章!1、React第三方组件6(状态管理之Mobx的使用①简单使用)---2018.03.282、React第三方组件6(状态管理之Mobx的使用②TodoList上)---2018.03.293、React第三方组件6(状态管理之Mobx的使用③TodoList中)---2018.03.304、React第三方组件6(状态管理之Mobx的使用④TodoList下)---2018.04.025、React第三方组件6(状态管理之Mobx的使用⑤异步操作)---2018.04.03开发环境:Windows8,nodev8.9.1,npm5.5.1,WebStorm2017.2.21、我们复制一份mobx4到mobx5,并修改mobx下Index.jsx文件2、修改State.jsimportapiRequestAsyncfrom'../../../../public/js/apiRequestAsync';复制@actionpostList=async()=>{ let
我是AY,杨洋,做wpf开发的,最近得了一种病,程序员患得患失综合征。同事说,我年纪在变大,技术跟不上。业余之间,我原创了写了一些语录,给大家中午休息,累疲惫的时候,开心放松下。 1.活着的每一天都无比珍贵,或许哪天启动调试了,人没了,断点还在 2.每一个断点的诞生,都应该由你取消它,而不是别人。 3.为了工作而活你是好员工,为了自己而活你是真实的。 4.我不写文档,不是不会写,而是写不出,你们理解的规范,我只会txt 5.除了代码我觉得大保健和游戏是大多男码农的兴趣了。 6.生活里不应该只有代码,还有你的家人和朋友,他们能给你带来更多的需求。 7.一个好的键盘能够学习你的编码习惯,不是它人工智能,而是你敲多了。 8.我为什么不为自己买个上万笔记本,钱不是不够,而是我长大了,结过婚。 9.爱因斯洋说过,需求和bug是比女人还难缠的东西。 10.我说一万句,也永远抵不过领导的一句,“你必须按我的来” 11.工作时间,你说啥是啥,下班时候,我说啥就是啥 12.地铁上背单词,低着头嘀咕的时候,注意瞟一下周围人关爱你的眼神 13.我总以为我会猝死,死的时候没想到是在半夜12点回家的路上猝死
目录优质网站(珍藏)一程序员二搞学习三找书籍四黑科技五写代码六搜资源七小工具八工具集九看视频十学设计十一搞文档十二找图片十三分享博客 优质网站(珍藏) 一程序员 程序员521:https://www.cxy521.com/ 7zip:https://www.7-zip.org/ 向日葵:https://sunlogin.oray.com/download?categ=personal Lofter:https://www.lofter.com/ everything:https://www.voidtools.com/zh-cn/ 腾讯会议:https://meeting.tencent.com/ 二搞学习 TED(最优质的演讲):https://www.ted.com/ 谷粉学术:https://gfsoso.99lb.net/scholar.html 简答题:https://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/
返回值引起的一次问题 问题起始于一次命令调用出错,获取返回值为零的情况。在此做个记录。一个严谨的程序最少应该有两个返回值,零和非零,分别用来表示正常和异常的执行。 问题背景:在linux中执行python脚本,脚本中使用cmd调用hive-e来执行hivesql,脚本使用命令的exitcode退出。可是有几次异常退出后,python脚本执行的返回值为零,导致其他模块认为执行成功,不做处理。 问题定位:在log中找到exitcode,发现不为零。觉得应该是linux的返回值问题。发现exitcode大于255而且刚好为256的整数倍。 问题分析:linux的返回码为一个Byte(8位),即0~255,大于255则取模。 关于linux和c语言的exitcode exitcode 都调用了系统调用的_exit,_exit函数中status参数定义了进程的终止状态,父进程可以通过wait()来获取该状态值。需要注意的是返回值,虽然status是int型,但是仅有低8位可以被父进程所用。所以写exit(-1)结束进程时,在终端执行“$?”会发现返回值是255。 退出状态码的约定 如果
教练不知道从哪里整来一堆交互题 Prob1 现在有一个字符串\(S\),由<,>,[,]构成。现在只告诉你他的长度,你想要知道他是不是一个合法的括号串。 你需要实现一个函数memory,每次你可以询问一次某个位置的字符,然后你需要返回一个\([0,2^{22}-1]\)的整数或者\(-1,-2\)。如果返回\(-1\)代表这是一个括号串,\(-2\)代表不是。否则你可以将你上次返回的整数作为参数再传入memory函数。 你需要再只使用该参数的情况下回答问题。你最多可以调用\(15000\)次memory函数。\(1\le|S|\le100\)。 谔谔只能用\(22\)位,所以不能直接用一个栈来匹配。但是我们发现长度貌似很短,所以考虑直接对每个位置判断他能否匹配。\((i,j)\)显然能够匹配的必要条件是\([i+1,j-1]\)这之间的数都得匹配上(当然这俩还得适配)。但是我们发现此时不再关心\([i+1,j-1]\)里<,[的区别了。于是我们只需要记以下几个东西: 目前需要被匹配的位置(7位) 目前需要被匹配的类型(1位) 目前栈的大小(7位) 目前枚举到的位
一.概述 默认情况下Nginx会把所有的访问日志生成到一个指定的访问日志文件access.log里,但这样一来,时间长了就会导致日志个头很大,不利于日志的分析和处理,因此,有必要对Nginx日志,按天或按小时进行切割,使其分成不同的文件保存。这里使用按天切割的方法。 日志切割实现的原理是将正在写入的access.log日志改名为带日期格式的文件,然后平滑重新加载Nginx,生成新的access.log日志文件。 二.shell脚本实现 1.早期用过的shell脚本(cut_nginx_log.sh) #!/bin/bash #Thisscriptrunat00:00 #TheNginxlogspath logs_path="/usr/local/nginx/logs/" mkdir-p${logs_path}$(date-d"yesterday"+"%Y")/$(date-d"yesterday"+"%m")/ mv${logs_path}access.log${logs_path}$(date-d"yesterday"+"%Y")/$(date-d"yesterday"+
博客 http://blog.csdn.net/seven_first/article/details/47378697 https://zhuanlan.zhihu.com/p/25127756?refer=xiaoleimlnote https://github.com/BUPTLdy/Caffe_Code_Analysis/tree/master/ 学习计划 Caffe运行主要流程 caffe.cpp //Asimpleregistryforcaffecommands. typedefint(*BrewFunction)(); typedefstd::map<caffe::string,BrewFunction>BrewMap; BrewMapg_brew_map; #defineRegisterBrewFunction(func)\ namespace{\ class__Registerer_##func{\ public:/*NOLINT*/\ __Registerer_##func(){\ g_brew_map[#func]=&func;\ }\ }
前置条件:React16.8+项目、引用AntdUI组件库 问题:自定义Form表单控件时,表单提交获取不到控件值 解决思路: 自定义表单时,经常会封装一些复杂的控件,然而像Input这样的输入控件,不直接作为Form.Item的子元素的时候,值就会获取不到。例如使用 Popover包裹Input组件的时候。 重点在给Input绑定props,使其成为受控组件,props包含value属性和onChange方法。通过props.onChange方法为控件更新值。可以参考受控组件的实现方式。 解决案例:(在线demo) importReact,{useState,useEffect}from"react"; import{Form,Popover,Input,Row,Col,Button,message}from"antd"; import{ChromePicker}from"react-color"; import"./styles.css"; constColorPicker=(props)=>{ const{defaultColor=