首页 > 编程知识 正文

怎么合并两个数组,两个数组合并成一个

时间:2023-05-06 08:45:25 阅读:62308 作者:3952

最近,我在编写代码时发现需要合并两个数组,突然发现以前没有使用过,所以研究了合并数组的方法,总结如下。

1.System.arraycopy ()方法

)1)分析

读了JDK的源代码后,方法的原型如下:

publicstaticnativevoidarraycopy (对象src,int srcPos,对象dest,int destPos,int length ); 其中:

src是源数组

srcPos是源数组复制的开始位置

dst是目标数组

destPos是目标数组接收复制数据的起始位置

长度是副本的长度。 需要从源数组中的复制开始位置srcPos进行复制的长度

如您所见,此方法是本地方法,无法更深入地理解其原理,但它起到了将源数组从起始位置srcPos复制到目标数组中长度较长的元素,目标数组从destPos位置接收复制元素的作用

)2)示例

String[] aa={'11 ',' 22 ',' 33'}; String[] bb={'44 ',' 55 ',' 66'}; String[] cc={'77 ',' 88 ',' 99'};//两个序列string [ ] DD=new string [ aa.length bb.length ]; 系统. arraycopy (aa,0,dd,0,aa.length ); 系统. arraycopy (bb,0,dd,aa.length,bb.length );//三个序列string [ ] ee=new string [ aa.length bb.length cc.length ]; 系统. arraycopy (aa,0,ee,0,aa.length ); 系统. arraycopy (bb,0,ee,aa.length,bb.length ); 系统. arraycopy (cc,0,ee,aa.length bb.length,cc.length ); 2.ArrayUtils.addAll ()方法

)1)分析

ArrayUtils工具位于apache commons-lang3-3.5的commons-lang3-3.5.jar(jar软件包下载位置)中,因此必须在使用前导入此软件包。 阅读源代码时,您会发现它调用了addAll (方法本质上是System.arraycopy )方法。

公共静态t [ ] addall (finalt [ ] array 1,final T. array2) if ) array1==null ) return clone (array2); }elseif(Array2==null )返回克隆(Array1); } final Class? type1=array1.getClass ().getComponentType ); @suppresswarnings(unchecked )/ok,because array is of type T final //a处t ) ) joinedarray=(t () ) array.newinstanang SSSS try { //b的system.arraycopy (array 2,0,joinedArray,array1.length,array2.length ); }财务阵列封装(finalarraystoreexceptionase )//checkifproblemwasduetoincompatibletypes/* * wedothishere, ratherthanbeforethecopybecause : *-itwouldbeawastedcheckmostofthetime *-safer,incasecheckturnsouttobetoostrict * /文件if (! type1.isassignablefrom(type2) thrownewillegalargumentexception (' cannot store ' type2. getname ) ' inanarrayof ' )。 } throw ase; //No,sorethroworiginal } returnjoinedarray; }该方法的两个重要部分是代码中的a、b这两个地方。 在a中,首先通过反射定义阵列,即阵列joinedArray1、array2的长度之和,然后将array1复制到joinedArray中,在b中将array2复制到joinedArray中。 除了这两个地方以外,也需要注意异常处理。 捕获异常后,我们确定type1是否由type2继承,即与array1对应的类型是否与与array2对应的类型相同,或者与array1对应的类型是否为与array2对应的类型的子类。 否则,可能不兼容。

)2)示例

//两个数组string [ ] ff=array utils.addall (aa,bb ); //将多个字符串合并到数组中构成新数组的string [ ] gg=array utils.addall (aa,' 12 ',' 13 ' ); string [ ] hh=array utils.addall (aa,' 12 ',' 13 ',' 14 ' ); string [ ] ii=array utils.addall (aa,' 12 ',' 13 ',' 14 ',' 15 ' );//三个序列string [ ] GL DDR=array utils.addall (aa,bb ); string [ ] kk=array utils.addall (GL DDR,cc ); addAll (的第二个参数是可变参数,可以传递多个相同类型的值,也可以传递一个该类型的数组。

(3)错误处理

使用中发生了问题。 具体如下。

代码1 :

string [ ] ll=array utils.addall (aa,bb,cc ); 根据提示,addAll ()的返回类型为Serializable[] ),并且与String[] ) )兼容。 所以我把代码改为:

代码2 :

arrayutils.addall(aa、bb、cc ); 我以为只是合并而不接收返回值,不会报告错误,但编译通过了,但执行报告了错误。 错误信息如下。

exceptioninthread ' main ' Java.lang.illegalargumentexception : cannotstorejava.io.serializableinanarrrayofjava.lana tils.Java:5084 ) atcom.Liu.date 2017 05 24.mergeArrays.main ) merge arrays )。 caused by : Java.lang.arraystoreexceptionatjava.lang.system.arraycopy (本机方法) atorg.Apache.com mons.lang3. array utils.addAll (array utils.Java 33605073 ) .1 more当时陷入惯性思维,因此addAll和List等addall 发现addAll (的第二个参数的类型是t,而不是T[],因此不能合并两个或多个数组。 希望大家能以此为戒。

原文地址: https://www.jb51.net/article/160480.htm

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。