开发者社区 问答 正文

如何在Java中连接两个数组?

我需要连接StringJava中的两个数组。

void f(String[] first, String[] second) { String[] both = ??? }

最简单的方法是什么?

展开
收起
保持可爱mmm 2020-01-08 17:06:35 386 分享 版权
1 条回答
写回答
取消 提交回答
  • 这是一个简单的方法,它将两个数组连接起来并返回结果:

    public T[] concatenate(T[] a, T[] b) { int aLen = a.length; int bLen = b.length;

    @SuppressWarnings("unchecked")
    T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), aLen + bLen);
    System.arraycopy(a, 0, c, 0, aLen);
    System.arraycopy(b, 0, c, aLen, bLen);
    
    return c;
    

    }

    请注意,它不适用于原始数据类型,仅适用于对象类型。

    以下稍微复杂一些的版本适用于对象数组和基本数组。它通过使用T而不是T[]作为参数类型来做到这一点。

    通过选择最通用的类​​型作为结果的组件类型,还可以连接两种不同类型的数组。

    public static T concatenate(T a, T b) { if (!a.getClass().isArray() || !b.getClass().isArray()) { throw new IllegalArgumentException(); }

    Class<?> resCompType;
    Class<?> aCompType = a.getClass().getComponentType();
    Class<?> bCompType = b.getClass().getComponentType();
    
    if (aCompType.isAssignableFrom(bCompType)) {
        resCompType = aCompType;
    } else if (bCompType.isAssignableFrom(aCompType)) {
        resCompType = bCompType;
    } else {
        throw new IllegalArgumentException();
    }
    
    int aLen = Array.getLength(a);
    int bLen = Array.getLength(b);
    
    @SuppressWarnings("unchecked")
    T result = (T) Array.newInstance(resCompType, aLen + bLen);
    System.arraycopy(a, 0, result, 0, aLen);
    System.arraycopy(b, 0, result, aLen, bLen);        
    
    return result;
    

    }

    这是一个例子:

    Assert.assertArrayEquals(new int[] { 1, 2, 3 }, concatenate(new int[] { 1, 2 }, new int[] { 3 })); Assert.assertArrayEquals(new Number[] { 1, 2, 3f }, concatenate(new Integer[] { 1, 2 }, new Number[] { 3f }));

    问题来源于stack overflow

    2020-01-08 17:07:00
    赞同 展开评论
问答分类:
问答地址: