2010-04-02 16 views

ответ

6

Простой цикл будет работать, это не сложно, но будет зависеть от порядка, который вы хотите копировать. Например (основано на том факте, что в вашем примере массивы все имеют одинаковую длину):

int[] newArray = new int[3 * a.length]; 
int index = 0; 
for (int n = 0; n < a.length; n++) { 
    newArray[index++] = a[n]; 
    newArray[index++] = b[n]; 
    newArray[index++] = c[n]; 
} 

или (другой порядок, а, б, в могут быть разной длины):

int[] newArray = new int[a.length + b.length + c.length]; 
System.arrayCopy(a, 0, newArray, 0, a.length); 
System.arrayCopy(b, 0, newArray, a.length, b.length); 
System.arrayCopy(c, 0, newArray, a.length + b.length, c.length); 
+1

Примеры массивов не имеют одинаковой длины. a.length == 5, b.length == 4, c.length == 4. – phihag

+1

Также стоит упомянуть, что два примера заканчиваются разными порядками для окончательного сплющенного массива, если это имеет значение.В первом примере массивы «сотканы», а во втором - «от конца до конца», если это имеет смысл –

+1

@Kevin, я думаю, что я упомянул, что: 'другой порядок, a, b , c может быть разной длины – rsp

-1

Подсчитайте общее количество элементов в оригиналеArray. Создайте новый массив этой длины. Скопируйте элементы один за другим в новый массив.

Я не знаком с какой-либо библиотечной функцией, чтобы сделать это.

4

Там будет 2 шага:

1) выяснить общее количество элементов, чтобы создать новый вектор (1d массив)

2) итерацию через 2d массива в определенном порядке и скопировать его элементы в созданный вектор

int elementsNumber = 0; 

for (int i = 0; i < originalArray.length; i++) { 
    elementsNumber += originalArray[i].length; 
} 

int[] newArray = new int[elementsNumber]; 
int j = 0; 
for (int i = 0; i < originalArray.length; i++) { 
    System.arrayCopy (originalArray[i], 0, newArray, j, originalArray[i].length); 
    j += originalArray[i].length; 
} 
2

Поскольку массивы не могут быть расширены (т.е. вы должны объявить размер ошибки при инициализации), вы должны пройти через массивы дважды:

int size = 0; 
for (int[] ar : originalArray) size += ar.length; 
int[] result = new int[size]; 
int pos = 0; 
for (int[] ar : originalArray) { 
    System.arraycopy(ar, 0, result, pos, ar.length); 
    pos += ar.length; 
} 
+0

Ого, я очень удивлен, рекурсия не является необходимым. – dclowd9901

+0

Кто-нибудь протестировал это решение? –

+0

можно ли использовать цикл? – Jessy

38

С Guava, вы можете использовать либо

int[] all = Ints.concat(originalArray);

или

int[] all = Ints.concat(a, b, c);

+11

Downvoted why? Кто хочет написать весь этот код выше, когда им это нужно? –

+0

Есть ли способ сделать то же самое для массива объектов? – gvlasov

+3

'ObjectArrays.concat' –

2
int[] oneDArray = new int[arr.length*arr.length]; 
    //Flatten 2D array to 1D array... 
    int s = 0; 
    for(int i = 0; i < arr.length; i ++) 
      for(int j = 0; j < arr.length; j ++){       
       oneDArray[s] = arr[i][j]; 
       s++; 
      } 
23

С Java 8 вы можете "flatMap" внутренние массивы:

int[] flatArray = Arrays.stream(originalArray) 
     .flatMapToInt(Arrays::stream) 
     .toArray(); 

или:

int[] flatArray = Stream.of(a, b, c) 
     .flatMapToInt(Arrays::stream) 
     .toArray(); 
Смежные вопросы