2014-02-11 3 views
0

Если у меня есть массив int[] a = new int[]{1, 2, 3}; и другой int[] b = new int[]{3, 2};, и я хочу, чтобы добавить их вместе, я хотел бы сделать:Как добавить два массива разных размеров?

if (a.length >= b.length){ 
    int[] c = new int[a.length]; 

    for(int i=0; i<c.length; i++){ 
     c[i] = a[i] + b[i]; 
     return c; 
    } 
} 
else{ 
    int[]c = new int[b.length]; 

    for(int i=0; i<c.length; i++){ 
     c[i] = a[i] + b[i]; 
     return c; 
    } 

Но когда я печатаю с, я получаю {4, 4} и 3 на конце не указано, где я ошибаюсь?

Заранее благодарим за любую помощь!

public Poly add(Poly a){ 

    if (coefficients.length <= a.coefficients.length){ 
     int[] c = new int[coefficients.length]; 

     for (int i=0; i<added.length; i++){ 
      c[i] = a.coefficients[i] + coefficients[i]; 
     } 

     Poly total = new Poly(c); 
     return total; 
    } 
    else{ 
     int[] added = new int[a.coefficients.length]; 

     for (int i=0; i<added.length; i++){ 
      added[i] = a.coefficients[i] + coefficients[i]; 
     } 

     Poly total = new Poly(c); 
     return total; 
    }  
} 

и Поли является конструктор, который принимает целочисленный массив в качестве аргумента (Poly ex = new Poly(new int[]{1, 2, 3}))

+0

Duplicate of: [Как объединить два массива в Java?] (Http://stackoverflow.com/questions/80476/how-to-concatenate-two-arrays-in-java) –

+2

@ Mr.Polywhirl Это в не о конкатенации. Пожалуйста, перечитайте вопрос. –

+0

@dsdouglous не могли бы вы добавить больше кода/контекста к тому, как вы вызываете добавление массивов? Помог бы мне дать лучший ответ. – xlm

ответ

2

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

import java.util.Arrays; 

class AddArrays { 
    private static int[] a = new int[] { 1, 2, 3 }; 
    private static int[] b = new int[] { 3, 2 }; 
    private static int[] c = add(a, b); 

    private static int[] add(int[] a, int[] b) { 
     int[] c = new int[(int) Math.max(a.length, b.length)]; 
     for (int i = 0; i < c.length; i++) { 
      if (a.length > i) { 
       c[i] += a[i]; 
      } 
      if (b.length > i) { 
       c[i] += b[i]; 
      } 
     } 
     return c; 
    } 

    public static void main (String[] args) { 
     System.out.println(Arrays.toString(c)); 
    } 
} 

Выход:

[4, 4, 3] 
+0

+1 Это более или менее то, что я собирался сказать. Вы можете использовать тернар вместо 'Math .max': 'a.length jpmc26

0

Во-первых, вы получите ArrayIndexOutOfBoundsException, потому что на последней итерации (третьей итерации): c[2] = a[2] + b[2], b[2] вне связанной, поскольку она меньше. Таким образом, вы не можете проверить значение null, в этом случае вам нужно проверить длину более короткого массива.

Также я не уверен, как вы получаете {4, 4}, потому что мне нужно больше кода, чтобы понять, что происходит.

Но в любом случае вот решение, чтобы избежать ArrayIndexOutOfBoundsException:

public static int[] add(int[] a, int[] b) { 
    int[] c; 

    if (a.length >= b.length){ 
     c = new int[a.length]; 

     for(int i=0; i<c.length; i++){ 
      c[i] = (i < b.length) ? a[i] + b[i]: a[i]; 
     } 
    } 
    else{ 
     c = new int[b.length]; 

     for(int i=0; i<c.length; i++){ 
      c[i] = (i < a.length) ? a[i] + b[i]: b[i]; 
     } 
    } 
    return c; 
} 
+0

. Я бы это проверил, сказав «if (a [i] == null) {c [i] = b [i]}, или это не сработает, потому что вы не может сравнивать ints с null? Если нет, как бы я их сопоставил? – dsdouglous

+0

@ user3279087 зависает, есть еще несколько проблем с кодом, обновляясь сейчас. – xlm

+0

@dsdouglous, если вам нравится выяснять, почему ваш код возвращался {4, 4}, пожалуйста, предоставьте больше кода, и я помогу проанализировать. В противном случае вы должны найти, что метод выше должен делать то, что вы намереваетесь. – xlm

0

Вы вышли за пределы, потому что программа ищет номера на третьем месте в «а» и «б» массив. В массиве «a» это номер 3, но массив «b» не имеет такого номера, поэтому вы получаете индекс ошибок за пределами границ. Я исправил эту проблему, выполнив следующую вещь:

if (a.length >= b.length){ 
    int[] c = new int[a.length]; 

    for(int i=0; i < c.length; i++){ 
     if (i < b.length) 
      c[i] = a[i] + b[i]; 
     else 
      c[i] = a[i]; 
    } 

    return c; 

} else { 
    int[]c = new int[b.length]; 

    for(int i=0; i<c.length; i++){ 
     if (i < a.length) 
      c[i] = a[i] + b[i]; 
     else 
      c[i] = b[i]; 
    } 

    return c; 

} 

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

0

У вас есть несколько проблем, а именно:

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

Если бы я был таким, я бы предположил, что один из них был более длинным массивом и заменял ссылки, если это не так. Таким образом, вам нужно написать только один цикл.

static int[] sum(int[] a, int[] b) { 
    int[] c; 

    if(b.length > a.length) { 
     c = a; 
     a = b; 
     b = c; 
    } 

    c = Arrays.copyOf(a, a.length); 

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

    return c; 
} 

Вместо copyOf, иначе вы могли бы это сделать что-то вроде этого:

... 

    c = new int[a.length]; 

    int i = 0; 
    for(; i < b.length; i++) { 
     c[i] = a[i] + b[i]; 
    } 
    for(; i < a.length; i++) { 
     c[i] = a[i]; 
    } 

    return c; 
} 

Или вместо второго цикла:

System.arraycopy(a, i, c, i, a.length - i); 

Я думаю, что любой из них являются более ясным, чем альтернатива, которая заключалась бы в постановке оператора if внутри цикла:

for(int i = 0; i < c.length; i++) { 
     if(i < b.length) { 
      c[i] = a[i] + b[i]; 
     } else { 
      c[i] = a[i]; 
     } 
    } 

Это еще одна ветка, которая технически будет немного медленнее.

Смежные вопросы