如何把2个数组合并为一个数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把2个数组合并为一个数组相关的知识,希望对你有一定的参考价值。

把2个数组合并为一个数组有四种方法可以实现:

一、apache-commons
这是最简单的办法。在apache-commons中,有一个ArrayUtils.addAll(Object[], Object[])方法,可以一行搞定:
String[] both = (String[]) ArrayUtils.addAll(first, second);
其它的都需要自己调用jdk中提供的方法,包装一下。
为了方便,将定义一个工具方法concat,可以把两个数组合并在一起:
static String[] concat(String[] first, String[] second)
为了通用,在可能的情况下,将使用泛型来定义,这样不仅String[]可以使用,其它类型的数组也可以使用:
static <T> T[] concat(T[] first, T[] second)
当然如果jdk不支持泛型,或者用不上,可以手动把T换成String。

二、System.arraycopy()
[java] view plain copy
static String[] concat(String[] a, String[] b)
String[] c= new String[a.length+b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
return c;

使用如下:
String[] both = concat(first, second);

三、Arrays.copyOf()
在java6中,有一个方法Arrays.copyOf(),是一个泛型函数。可以利用它,写出更通用的合并方法:
[java] view plain copy
public static <T> T[] concat(T[] first, T[] second)
T[] result = Arrays.copyOf(first, first.length + second.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;

如果要合并多个,可以这样写:
[java] view plain copy
public static <T> T[] concatAll(T[] first, T[]... rest)
int totalLength = first.length;
for (T[] array : rest)
totalLength += array.length;

T[] result = Arrays.copyOf(first, totalLength);
int offset = first.length;
for (T[] array : rest)
System.arraycopy(array, 0, result, offset, array.length);
offset += array.length;

return result;

使用如下:
String[] both = concat(first, second);
String[] more = concat(first, second, third, fourth);

四、Array.newInstance
还可以使用Array.newInstance来生成数组:
[java] view plain copy
private static <T> T[] concat(T[] a, T[] b)
final int alen = a.length;
final int blen = b.length;
if (alen == 0)
return b;

if (blen == 0)
return a;

final T[] result = (T[]) java.lang.reflect.Array.
newInstance(a.getClass().getComponentType(), alen + blen);
System.arraycopy(a, 0, result, 0, alen);
System.arraycopy(b, 0, result, alen, blen);
return result;
参考技术A 假设要合ch1[len1],ch2[len2];先计算两个数组的长度之和len=len1+len2,然后新定义char ch[len],把ch1[len1],,ch2[len2]复制到ch,比如可以直接使用2while循环一个一个元素复制过去。i,j,k都初始化为0;while(ch1[i++])ch[j++]=ch1[i++];while(ch2[k++])ch[j++]=ch2[k++];本回答被提问者和网友采纳

OC中如何将一个字符串截取成若干个数组对象

参考技术A 1.OC的数组成员是任意的对象指针 与C中的链表结构类似(以nil结尾) 一切的数组操作不能越界
OC的数组分为不可变数组 NSArray 可变数组 NSMutableArray
NSArray * array = [[NSArray alloc]initWithObjects:@"one",@"two",@"three", nil];
NSLog(@"%@",[array objectAtIndex:0]);//通过下标获取数组成员(下标从0开始)
NSLog(@"%ld",[array count]);//获取数组有效成员个数 (不包括nil)
for (i = 0; i < [array count]; i++) //遍历数组(C方法)
NSLog(@"%@",[array objectAtIndex:i]);

NSLog(@"%@",array);//(OC)查看数组内容(先给array发送description消息,然后给每个成员都发送一个description消息)
NSArray * array1 = [[NSArray alloc]initWithArray:array];//创建数组对象 相当于拷贝
NSArray * arry2 = [NSArray arrayWithArray:array];//创建数组对象 相当于拷贝
NSEnumerator * enumer = [array objectEnumerator];//正序枚举器
//创建一个枚举器 把数组的每个元素的地址一次赋给枚举器,然后建立起某种关联 (枚举器只能用来读数组成员)
//枚举时 会和数组创建某种关联(修改监视器/迭代器) 限制枚举的同时不能修改元素 只能读不能写
id obj;
//第一次循环把数组的第一个元素赋给obj 第二次循环把第二个数组元素赋给obj
while (obj = [enumer nextObject]) //遍历数组
NSLog(@"%@",obj);

//快速枚举 第一次循环把array的第一个元素赋给ob 第二次循环把array的第二个元素赋给ob 直到nil(只能读不能改)
for(id ob in array)
NSLog(@"%@",ob);

//逆序输出数组(创建逆序枚举器 第一次循环把最后一个元素赋给obj )
NSEnumerator * enumer1 = [array reverseObjectEnumerator];
while (obj = [enumer1 nextObject])
NSLog(@"%@",obj);

if ([obj isKindOfClass:[Dog class]]) //获取类的类型 判是否是指定类的对象
if ([obj isMemberOfClass:[Dog class]])


2.不可变数组
-------查找

NSArray * array = [[NSArray alloc]initWithObjects:@"one",@"two",@"three",@"one", nil];

NSUInteger index = [array indexOfObject:@"one123"];//返回第一个找到的数组成员对应的下标 找不到返回NSNotFound

index = [array indexOfObject:@"one" inRange:NSMakeRange(1, 3)];//在指定范围内查找
if (index != NSNotFound)
NSLog(@"%ld",index);

----抽取 组成新的数组
NSArray * array1 = [array objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]];
《数字集合》
NSIndexSet这是个数字集合类
[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]产生一个数字集合

3.可变数组
NSMutableArray * array = [[NSMutableArray alloc]initWithObjects:@"one",@"two",@"three",@"four", nil];
[array addObject:@"five"];//在数组尾部插入元素
[array insertObject:@"six" atIndex:5];//在数组指定下标位置插入元素(不能越界,最大值为length)

[array removeObject:@"six"];//删除指定元素(数组中出现的所有位置都将被删除)
[array removeObject:@"two" inRange:NSMakeRange(0, 3)];//从指定下标位置开始的指定长度内删除指定元素
[array removeLastObject];//删除最后一个元素
[array removeAllObjects];//删除所有元素

[array replaceObjectAtIndex:3 withObject:@"ios"];//将指定下标位置元素替换为指定的元素
[array exchangeObjectAtIndex:0 withObjectAtIndex:3];//将指定下标的两个元素进行交换

4.字符串分割与拼接
//@"" 空的字符串对象
-------分割
NSString * ptr = @"I am a man";
NSArray * array = [ptr componentsSeparatedByString:@" "];//将字符串整体作为分割条件 返回值为NSArray不可变数组
NSMutableArray * array1 = [NSMutableArray arrayWithArray:array];//若修改,则将NSArray转化为NSMutableArray
NSArray * array2 = [ptr componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@", "]];//以字符串中的字符作为分割条件进行分割
《字符集合》
NSCharacterSet 这是个字符集合类
[NSCharacterSet characterSetWithCharactersInString:@", "]//把字符串转化为字符集合
-------拼接
NSString * str = [array componentsJoinedByString:@" "];

若分割条件出现在开头或者结尾,则会出现空串@"",如果不需要,则需要转化成NSMutableString对空串进行处理
func1: [array1 removeObject:@""]; //找到空串直接删除
func2: for(id obj in array1)
if([obj length] == 0) //空串的长度为0
if([obj isEqualToString:@""]) //与空串进行比较(字符串是不能进行==比较的,要使用函数)

以上是关于如何把2个数组合并为一个数组的主要内容,如果未能解决你的问题,请参考以下文章

两个数组交叉合并为一个数组

合并两个有序数组

二路归并排序(也叫合并排序)

将两个列数组合并为配置单元中的 1 个数组列

JAVA,用List做,两个数组中数的合并和去除相同元素

js批量添加数组,2个数组合并