6

我有一种情况,我需要连接两个二维数组。

Object[][] getMergedResults() {
    Object[][] a1 = getDataFromSource1();
    Object[][] a2 = getDataFromSource2();
    // I can guarantee that the second dimension of a1 and a2 are the same
    // as I have some control over the two getDataFromSourceX() methods

    // concat the two arrays
    List<Object[]> result = new ArrayList<Object[]>();
    for(Object[] entry: a1) {
        result.add(entry);
    }
    for(Object[] entry: a2) {
        result.add(entry);
    }
    Object[][] resultType = {};

    return result.toArray(resultType);
}

我在这篇文章中查看了一维数组连接的解决方案,但无法使其适用于我的二维数组。

到目前为止,我想出的解决方案是遍历两个数组并将每个成员添加到 ArrayList,然后返回该数组列表的 toArray()。我确信一定有一个更简单的解决方案,但到目前为止还没有一个。

4

3 回答 3

7

你可以试试

Object[][] result = new Object[a1.length + a2.length][];

System.arraycopy(a1, 0, result, 0, a1.length);
System.arraycopy(a2, 0, result, a1.length, a2.length);
于 2012-12-05T11:58:25.623 回答
1

您可以使用 Apache Commons Library - ArrayUtils。仅更改第二维的索引并合并整行。

于 2012-12-05T11:51:32.163 回答
0

这是我用于二维数组连接的方法。它部分使用了 Sergio Nakanishi 的答案,但增加了双向连接的能力。

/*
 * Define directions for array concatenation
 */
public static final byte ARRAY_CONCAT_HORIZ = 0, ARRAY_CONCAT_VERT = 1;

/*
 * Concatenates 2 2D arrays
 */
public static Object[][] arrayConcat(Object[][] a, Object[][] b, byte concatDirection)
{
    if(concatDirection == ARRAY_CONCAT_HORIZ && a[0].length == b[0].length)
    {
        return Arrays.stream(arrayConcat(a, b)).map(Object[].class::cast)
                    .toArray(Object[][]::new);
    }
    else if(concatDirection == ARRAY_CONCAT_VERT && a.length == b.length)
    {
        Object[][] arr = new Object[a.length][a[0].length + b[0].length];
        for(int i=0; i<a.length; i++)
        {
            arr[i] = arrayConcat(a[i], b[i]);
        }
        return arr;
    }
    else
        throw new RuntimeException("Attempted to concatenate arrays of incompatible sizes.");
}

/*
 * Concatenates 2 1D arrays
 */
public static Object[] arrayConcat(Object[] a, Object[] b)
{
    Object[] arr = new Object[a.length + b.length];
    System.arraycopy(a, 0, arr, 0, a.length);
    System.arraycopy(b, 0, arr, a.length, b.length);
    return arr;
}
于 2017-02-07T01:29:50.610 回答