it-swarm.com.ru

Объединить два целочисленных массива

Есть ли способ создать один массив из двух? Например.

int[] array1 = {1,2,3};
int[] array2 = {4,5,6};
int[] array1and2 = array1 + array2;
25
Jon

Вы не можете добавить их напрямую, вы должны создать новый массив и затем скопировать каждый из массивов в новый. System.arraycopy это метод, который вы можете использовать для выполнения этой копии.

int[] array1and2 = new int[array1.length + array2.length];
System.arraycopy(array1, 0, array1and2, 0, array1.length);
System.arraycopy(array2, 0, array1and2, array1.length, array2.length);

Это будет работать независимо от размера array1 и array2.

66
Kaleb Brasee

Вот простая функция, которая использует переменные аргументы:

final static
public int[] merge(final int[] ...arrays ) {
    int size = 0;
    for ( int[] a: arrays )
        size += a.length;

        int[] res = new int[size];

        int destPos = 0;
        for ( int i = 0; i < arrays.length; i++ ) {
            if ( i > 0 ) destPos += arrays[i-1].length;
            int length = arrays[i].length;
            System.arraycopy(arrays[i], 0, res, destPos, length);
        }

        return res;
}

Использовать:

int[] array1 = {1,2,3};
int[] array2 = {4,5,6};
int[] array3 = {7,8,9};
int[] array1and2and3 = merge(array1, array2, array3);
for ( int x: array1and2and3 ) 
    System.out.print( String.format("%3d", x) );
7
Luca Sepe
int [] newArray = new int[old1.length+old2.length];
System.arraycopy( old1, 0, newArray, 0, old1.length);
System.arraycopy( old2, 0, newArray, old1.length, old2.length );

Не используйте поэлементное копирование, это очень медленно по сравнению с System.arraycopy()

3
biziclop

используйте ArrayUtils.addAll (T [], T ...):

import org.Apache.commons.lang3.ArrayUtils;

AnyObject[] array1 = ...;
AnyObject[] array2 = ...;
AnyObject[] mergedArray = ArrayUtils.addAll(array1, array2);
2
piero83

Да, но это не так просто. Создайте третий массив размером с два объединенных массива, переберите каждый исходный массив и переместите элементы поверх. Также загляните в System.arraycopy().

1
jzd

Найдите общий размер обоих массивов и установите для array1and2 общий размер обоих добавленных массивов. Затем выполните цикл array1, а затем array2 и добавьте значения в array1and2.

1
thotheolh

ПРИМЕЧАНИЕ: не проверял

int[] concatArray(int[] a, int[] b) {
  int[] c = new int[a.length + b.length];
  int i = 0;
  for (int x : a) { c[i] = x; i ++; }
  for (int x : b) { c[i] = x; i ++; }
  return c;
}
1
Ming-Tang

Задача: При наличии двух массивов int array1 и array2 одинаковой длины Zip должен вернуть массив, вдвое длиннее, в котором чередуются элементы array1 и array2. То есть, элемент № 0 результирующего массива - это array1 [0], элемент # 1 - это array2 [0], элемент # 2 - это array1 [1], элемент # 3 - это array2 [1] и так далее.

public static int [] Zip(int [ ] array1, int [] array2) {
//make sure both arrays have same length
if (array1.length != array2.length) {
    throw new IllegalArgumentException("Unequal array lengths - Zip not possible");
}

int [] zippedArray = new int [array1.length+ array2.length]; 
int idx_1 = 0;
int idx_2 = 0;

//for each element of first array, add to new array if index of new array is even

for (int i=0; i < zippedArray.length; i+=2){
    zippedArray[i]= array1[idx_1++];
}
for (int i=1; i < zippedArray.length; i+=2){
    zippedArray[i]= array2[idx_2++];
}

//check contents of new array       
for (int item: zippedArray){
    System.out.print(item + " ");
}

return zippedArray;

}
0
Vince

Я думаю, что вы должны выделить новый массив и поместить значения в новый массив. Например:

int[] array1and2 = new int[array1.length + array2.length];
int currentPosition = 0;

for( int i = 0; i < array1.length; i++) {
    array1and2[currentPosition] = array1[i];
    currentPosition++;
}

for( int j = 0; j < array2.length; j++) {
    array1and2[currentPosition] = array2[j];
    currentPosition++;
}

Насколько я могу судить, просто глядя на это, этот код должен работать.

0
mnuzzo