2015-10-15 5 views
1

Каков наилучший способ объединить два массива с переменными значениями?Объединение двух массивов с переменными значениями

Скажем 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] 

Update: не требуется Без сортировки, так как массивы уже отсортированы, используя

+4

Вы хотите отсортировать результат или вы хотите выбрать элементы в качестве альтернативы из двух массивов? – Tunaki

+1

зависит от того, что для вас лучше всего подходит. Можете ли вы использовать внешние библиотеки или вам нужно сделать это самостоятельно? – SomeJavaGuy

+0

Предполагая равные длины и java 8, вы можете сделать 'int [] concat = IntStream.range (0, a1.length).flatMap (i -> IntStream.of (a1 [i], a2 [i])). toArray(); ' –

ответ

1

основной способ

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]; 
} 

предполагая, что оба массива будут иметь одинаковый размер.

+0

спасибо за исправление .. increement должно быть сделано в обоих утверждениях. – stinepike

+1

Работает отлично. Большое спасибо! – John

+0

Но это предполагает, что оба массива 'a1' и' a2' равны по длине и не сработают, если они не будут :) –

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: Результат будет отсортирован как в нужной продукции.

+0

не гарантируется, что a1 больше, чем a2. – morels

+0

спасибо, обновлено. – dsharew

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)); 
2

Поместите элементы как массив в виде списка, а затем сортировать it.You можно использовать лямбды также

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] 
2

Если вы хотите объединить все массивы длины (где тогда длины отличаются, остальные добавляются Ded к результату):

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; 
} 
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] 
0

Существуют методы полезности для примера addALL() методом из ArrayUtil класса. Но то, что они делают, является простым конкатенатом. Для вашей проблемы вам нужно написать свою собственную логику. Например, следующий код обеспечивает правильную альтернативную конкатенацию, даже если массивы имеют неравную длину.

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++; 
     } 
    } 
Смежные вопросы