使用交替值连接两个数组

时间:2015-10-15 09:24:43

标签: java arrays concatenation

将两个数组连接成交替值的最佳方法是什么?

我们说array1是:

[1, 3, 5, 7]

array2是:

[2, 4, 6, 8]

我想组合这两个数组,结果是:

[1, 2, 3, 4, 5, 6, 7, 8]

在Java中:

int[] a1 = { 1, 3, 5, 7 };
int[] a2 = { 2, 4, 6, 8 };
int[] concat = new int[a1.length * 2];
for (int i = 0; i < concat.length; i++) {
    // concatenation
}
System.out.println(concat.toString());
// should be [1, 2, 3, 4, 5, 6, 7, 8]

更新:不需要排序,因为数组已经使用Arrays.sort(array)进行排序

7 个答案:

答案 0 :(得分:3)

基本方式

int[] concat = new int[a1.length * 2];
int index = 0;
for (int i = 0; i < a1.length; i++) {
    concat[index++] = a1[i];
    concat[index++] = a2[i];
}

假设两个数组的大小相同。

答案 1 :(得分:2)

试试这样:

int[] concat = new int[a1.length + a2.length];

int k = 0, m = 0;

for (int i = 0; i < concat.length; i++) {
    if( k < al.length && a1[k] <= a2[m])
        concat[i] = a1[k++];
    else
        concat[i] = a2[m++];
}

NB :结果将按照您想要的输出进行排序。

答案 2 :(得分:2)

将两个数组的元素放在一个列表中然后对其进行排序。你也可以使用lambdas

Integer[] a1 = { 1, 3, 5, 7 };
Integer[] a2 = { 2, 4, 6, 8 };
List<Integer> list = new ArrayList<>();
list.addAll(Arrays.asList(a1));
list.addAll(Arrays.asList(a2));
System.out.println("Before Sorting "+list);
Collections.sort(list,(a, b) -> Integer.compare(a,b));
System.out.println("After Sorting "+list);

输出

Before Sorting [1, 3, 5, 7, 2, 4, 6, 8]
After Sorting [1, 2, 3, 4, 5, 6, 7, 8]

答案 3 :(得分:2)

如果你想将任何长度数组(然后长度不同,其余部分附加到结果)压缩在一起:

public static int[] zip(int[] a, int[] b){
    int[] result = new int[a.length + b.length];
    int index = 0;
    final int minLen = Math.min(a.length, b.length);
    for (int i = 0; i < minLen; i++) {
        result[index++] = a[i];
        result[index++] = b[i];
    }
    if(a.length > minLen)
      System.arraycopy(a, minLen, result, index, a.length - minLen);
    else if(b.length > minLen)
      System.arraycopy(b, minLen, result, index, b.length - minLen);
    return result;
}

答案 4 :(得分:1)

你也可以像你这样在你的循环中使用两个变量

int[] a1 = { 1, 3, 5, 7 };
int[] a2 = { 2, 4, 6, 8 };
int[] concat = new int[a1.length + a2.length];
for (int i = 0, j = 0; i+j < concat.length;) {
    if(i<a1.length) {
        concat[i+j] = a1[i++];
    }
    if(j<a2.length) {
        concat[i+j] = a2[j++];
    }

}
System.out.println(Arrays.toString(concat));

答案 5 :(得分:0)

如果它解决了你的问题,试试这个

int[] a1 = { 1, 3, 5, 7 };
int[] a2 = { 2, 4, 6, 8 };
int[] concat = new int[a1.length + a2.length];
System.arraycopy(a1, 0, concat, 0, a1.length);
System.arraycopy(a2, 0, concat, a1.length, a2.length);
Arrays.sort(concat);
System.out.println(Arrays.toString(concat));

输出:

[1, 2, 3, 4, 5, 6, 7, 8]

答案 6 :(得分:0)

ArrayUtil类中有一些实用方法,例如addALL()方法。但他们所做的是简单的连接。对于您的问题,您需要编写自己的逻辑。例如,即使数组长度不等,以下代码也可确保正确的备用连接。

    int[] a1 = { 1, 3, 5, 7 };
    int[] a2 = { 2, 4, 6, 8, 9, 10, 122 };
    int totalLen = a1.length + a2.length;
    int[] concat = new int[totalLen];// I made a change here incase the
                                        // arrays are not of equal length
    int i = 0; // this will be the concat array index counter
    int j1 = 0; // this will be the a1 array index counter
    int j2 = 0; // this will be the a2 array index counter
    while (i < totalLen) {

        if ((j1 < a1.length)) {
            concat[i] = a1[j1];
            i++;
            j1++;
        }

        if ((j2 < a2.length)) {
            concat[i] = a2[j2];
            i++;
            j2++;
        }
    }