Java中如何把两个数组合并为一个

JavaArray合并数组

目录(?)[+]

  1. 一apache-commons
  2. 二Systemarraycopy
  3. 三ArrayscopyOf
  4. 四ArraynewInstance

http://freewind.me/blog/20110922/350.html

在Java中,如何把两个String[]合并为一个?

看起来是一个很简单的问题。但是如何才能把代码写得高效简洁,却还是值得思考的。这里介绍四种方法,请参考选用。

一、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 plaincopyprint?

  1. static String[] concat(String[] a, String[] b) {
  2. String[] c= new String[a.length+b.length];
  3. System.arraycopy(a, 0, c, 0, a.length);
  4. System.arraycopy(b, 0, c, a.length, b.length);
  5. return c;
  6. }
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 plaincopyprint?

  1. public static <T> T[] concat(T[] first, T[] second) {
  2. T[] result = Arrays.copyOf(first, first.length + second.length);
  3. System.arraycopy(second, 0, result, first.length, second.length);
  4. return result;
  5. }
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 plaincopyprint?

  1. public static <T> T[] concatAll(T[] first, T[]... rest) {
  2. int totalLength = first.length;
  3. for (T[] array : rest) {
  4. totalLength += array.length;
  5. }
  6. T[] result = Arrays.copyOf(first, totalLength);
  7. int offset = first.length;
  8. for (T[] array : rest) {
  9. System.arraycopy(array, 0, result, offset, array.length);
  10. offset += array.length;
  11. }
  12. return result;
  13. }
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 plaincopyprint?

  1. private static <T> T[] concat(T[] a, T[] b) {
  2. final int alen = a.length;
  3. final int blen = b.length;
  4. if (alen == 0) {
  5. return b;
  6. }
  7. if (blen == 0) {
  8. return a;
  9. }
  10. final T[] result = (T[]) java.lang.reflect.Array.
  11. newInstance(a.getClass().getComponentType(), alen + blen);
  12. System.arraycopy(a, 0, result, 0, alen);
  13. System.arraycopy(b, 0, result, alen, blen);
  14. return result;
  15. }
时间: 2024-10-13 20:21:18

Java中如何把两个数组合并为一个的相关文章

怎么把两个数组合并成一个php

一个数组是$new[] 另一个是$fuids[] 都是一维数组 我想实现的是合并后的数组还是一维数组 比如说$new[]内容是1,2,3而$fuids[]的内容是4,5,6合并后的数组内容是1,2,3,4,5,6请问应该怎么合并 <? $a = array(1,3,4); $b = array('aa','bb','cc'); $c = array(); foreach($a as $key){ foreach ($b as $val){ $c[$key]= $val; } } var_dump

python中如何将两个list合并成一个list,不用for语句

1, add 2, 用list的extend方法,L1.extend(L2),该方法将参数L2的全部元素添加到L1的尾部,例如: 3, 用切片(slice)操作,L1[len(L1):len(L1)] = L2和上面的方法等价, 但切片方法用起来更灵活,可以插入到头部,或其他任意部位,也可以加到中间. 原文地址:https://www.cnblogs.com/qingyuanjushi/p/8409949.html

简述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

顺序表 | 二分查找:两个数组合并后的中位数

输入两个长度相同的升序数组,返回这两个数组合并后的中位数 C++代码: int bisearch_midNum(int a[],int b[],int n){ int s1=0,s2=0,d1=n-1,d2=n-1,m1,m2; while(s1!=d1 || s2!=d2){//只要a,b序列同时出现了s==d的情况,才能False退出 m1=(s1+d1)/2; m2=(s2+d2)/2; system("pause"); if(a[m1]==b[m2]) return a[m1]

python将两个数组合并成一个数组的两种方法的代码

内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","Green","Blue"]c2 = ["Orange","Yellow","Indigo"]c1.extend(c2) assert c1 == ["Red","Green",&q

Java中forEach, 用来遍历数组

这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i<d.length();i++)是一样的,但是forEach的可用场合较多. public class e1 {public static void main(String[] args){ int[]d=new int[] {1,2,3,4,64,1234,3124,657,22}; System.ou

述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

【C练习】两个已经从小到大的数组合并成为一个从小到大排序的数组

两个已经从小到大的数组合并成为一个从小到大排序的数组 1 #include<stdio.h> 2 int main() 3 { 4 int m,n,i,j,k,tem=0; 5 printf("这两个数组分别有多少个数:\n"); 6 scanf("%d%d",&m,&n); 7 int a[m],b[n],c[m+n]; 8 printf("从小到大输入%d个数:\n",m); 9 for(i=0;i<m;i+

java中线程分两种,守护线程和用户线程。

java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性,默认为用户线程. 区别:主线程结束后用户线程会继续运行,JVM存活:主线程结束后,如果没有用户线程,都是守护线程,则JVM结束. public class Mytest extends Thread { public void run() { for(int i=0;;i++){ try { Th