Чередование двух массивов java

252
06 февраля 2019, 02:30

Элементы двух массивов нужно поочередно занести в 3 массив. К примеру массивы A(n) и B(n) нужно записать как C(a1, b1, a2, b2, a3, b3)

public static void main(String[] args) {
    int[] arr1 = {0, 2, 4, 6, 8};
    int[] secarr6 = {1, 3, 5, 7, 9};
    int[] thirdarr = new int[arr1.length + secarr6.length];
    for (int i = 0; i < arr1.length; i++) {
        thirdarr[i * 2] = arr1[i];
    }
    for (int j = 0; j < secarr6.length; j++) {
        if (j % 2 != 0 || j == 0) {
            thirdarr[] = secarr6[];
        }
    }
    System.out.println(Arrays.toString(thirdarr));
}

c arr1 берет правильно, с secarr6 не понимаю (

Answer 1

Для равных длин массивов достаточно сделать

for (int i = 0; i < arr1.length; i++) {
      thirdarr[i * 2] = arr1[i];
      thirdarr[i * 2 + 1] = secarr6[i];
  }

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

if (arr1.length < secarr6.length) {
    interlen = arr1.length;
    slen = secarr6.length - arr1.length; 
    alen = 0;
}
else if (arr1.length > secarr6.length) {
    interlen = secarr6.length;
    alen = arr1.length - secarr6.length; 
    slen = 0;
}
else {
      alen = 0;
      slen = 0;
}
for (int i = 0; i < interlen; i++) {
      thirdarr[i * 2] = arr1[i];
      thirdarr[i * 2 + 1] = secarr6[i];
  }
for (int i = 0; i < alen; i++) {
      thirdarr[interlen * 2 + i] = arr1[i + interlen];
  }
for (int i = 0; i < slen; i++) {
      thirdarr[interlen * 2 + i] = secarr6[i + interlen];
  }
Answer 2
public static void main(String[] args){ 
int[] arr1 = {0, 2, 4, 6, 8}; 
int[] secarr6 = {1, 3, 5, 7, 9}; 
int[] thirdarr = new int[arr1.length + secarr6.length]; 
for (int i = 0; i < arr1.length; i++) {
 thirdarr[i * 2] = arr1[i]; 
 thirdarr[i*2+1]=secarr6[i]
}
Answer 3

1) Во втором цикле, по моему, вы что-то перемудрили. Я не понял, чего вы хотели добиться своей проверкой if (j % 2 != 0 || j == 0). Если длины массивов заведомо равны, то второй цикл должен выглядеть точно так же, как первый, с той разницей, что данные берутся из второго массива, а не из первого, и заносятся в третий массив по индексу j * 2 + 1, Иными словами, элементы первого массива становятся чётными элементами третьего, а элементы второго -- нечётными. И у вас индексы отсутствуют. То есть код второго цикла будет таким:

  for (int i = 0; i < a2.length; i++) 
    a3[i * 2 + 1] = a2[i];

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

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

2) Если массивы могут быть разной длины, то возможен такой вариант кода:

  int[] a1 = { ... }, a2 = { ... }; 
  int[] a3 = new int[a1.length + a2.length];
  int maxLen = Math.max(a1.length; a2.length), j = 0;
  for (int i = 0; i < maxLen; i++) {
    if (i < a1.lenght) a3[j++] = a1[i]; 
    if (i < a2.length) a3[j++] = a2[i];
  }

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

Answer 4

В цикле инкрементируем указатель для каждого из массивов.

    int[] arr1 = new int[0];
    //int[] arr1 = {0, 2, 4, 6, 8, 15, 17};
    int[] secarr6 = {1, 3, 5, 7, 9};
    int[] thirdarr = new int[arr1.length + secarr6.length];
    int index1 = 0;  // указатель для arr1
    int index2 = 0;  // указатель для secarr6
    while ((index1 + index2) < thirdarr.length ){
        if (index1 < arr1.length) thirdarr[index1 + index2] = arr1[index1++];    
        if (index2 < secarr6.length) thirdarr[index1 + index2] = secarr6[index2++]; 
    }
    System.out.println(Arrays.toString(thirdarr));
READ ALSO
Разбиение массива

Разбиение массива

Можем ли из массива вида: 2110

184
Получение объекта JSONObject и NullPointerException

Получение объекта JSONObject и NullPointerException

Пытаюсь создать тренировочный код, позволяющий выгружать с сайта wwwflickr

304
Уведомление которое нельзя убрать

Уведомление которое нельзя убрать

Всем приветДопустим создаю уведомление обычное в сервисе с помощью NotificationCompat

212
ServerSocket на Heroku

ServerSocket на Heroku

Проблема заключается в том, что я не могу подключиться к серверному сокету на хероку

194