Сумма двух разных 2D-массивов

Мне нужна помощь в написании метода, чтобы узнать сумму двух 2D-массивов разного размера.

public static int[][] summary(int[][] tab1, int[][] tab2, int x) {
    int[][] finalTab = new int[4][5]; // I took sizes of bigger one
    if (x < 0) {
        for (int i = 0; i < finalTab.length - 1; i++) {
            for (int j = 0; j < finalTab[i].length - 1; j++) {
                finalTab[i][j] = tab1[i][j] + tab2[i][j];
                if (tab1[i][j] == 0) {
                    finalTab[i][j] = tab2[i][j];
                }
            }
        }
        for (int i = 0; i < finalTab.length; i++) {
            for (int j = 0; j < finalTab[i].length; j++) {
                System.out.print(" " + finalTab[i][j] + " ");
            }
            System.out.println();
        }
    }
    return finalTab;
}

Вход:

int[][] tab1 = {
        {2, 4, 6, 8},
        {2, 4, 6, 8},
        {2, 4, 6, 8}};

int[][] tab2 = {
        {1, 3, 5, 7, 9},
        {1, 3, 5, 7, 9},
        {1, 3, 5, 7, 9},
        {1, 3, 5, 7, 9}};

Выход:

 3  7  11  15  0 
 3  7  11  15  0 
 3  7  11  15  0 
 0  0  0  0  0 

Вывод должен быть:

 3  7  11  15  9
 3  7  11  15  9
 3  7  11  15  9
 1  3  5  7  9

Как я могу заменить все 0 числами, соответствующими индексу tab2?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
658
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я сделал это так:

for (int i = 0; i < finalTab.length; i++)
    for (int j = 0; j < finalTab[i].length; j++)
        if (tab1.length > tab2.length) {
            finalTab[i][j] = tab1[i][j];
        } else
            finalTab[i][j] = tab2[i][j];

for (int i = 0; i < tab1.length; i++) {
    for (int j = 0; j < tab1[i].length; j++) {
        finalTab[i][j] = tab1[i][j] + tab2[i][j];
    }
}
Ответ принят как подходящий

вы можете сделать это более общим

public static int[][] summary(int[][] tab1, int[][] tab2, int x) {
    int maxLenX = tab1.length > tab2.length ? tab1.length : tab2.length;
    int maxLenY = tab1[0].length > tab2[0].length ? tab1[0].length : tab2[0].length;
    int[][] finalTab = new int[maxLenX][maxLenY]; // i took sizes of bigger one
    if (x < 0) {
        for (int i = 0; i <= finalTab.length - 1; i++) {
            for (int j = 0; j <= finalTab[i].length - 1; j++) {
                if (i > tab1.length - 1 || j > tab1[i].length - 1) {
                    finalTab[i][j] = tab2[i][j];
                } else if (i > tab2.length - 1 || j > tab2[i].length - 1) {

                    finalTab[i][j] = tab1[i][j];
                } else {
                    finalTab[i][j] = tab1[i][j] + tab2[i][j];
                }
            }
        }
        for (int i = 0; i < finalTab.length; i++) {
            for (int j = 0; j < finalTab[i].length; j++) {
                System.out.print(" " + finalTab[i][j] + " ");
            }
            System.out.println();
        }
    }
    return finalTab;
}

так что вы можете называть это так

summary(tab2, tab1, -1);

или

summary(tab1, tab2, -1);

Это более простое решение:

for (int i = 0; i < finalTab.length; i++) 
    for (int j = 0; j < tab1[i].length; j++) {
        int v1 = (i<tab1.length && j<tab1[i].length) ? tab1[i][j] : 0;
        int v2 = (i<tab2.length && j<tab2[i].length) ? tab2[i][j] : 0;
        finalTab[i][j] = v1 + v2;
    }

Вы можете использовать метод IntStream.of(int...) для объединения двух элементов из разных источников:

int[][] tab1 = {
        {2, 4, 6, 8},
        {2, 4, 6, 8},
        {2, 4, 6, 8}};
int[][] tab2 = {
        {1, 3, 5, 7, 9},
        {1, 3, 5, 7, 9},
        {1, 3, 5, 7, 9},
        {1, 3, 5, 7, 9}};
int[][] tab3 = IntStream
        // iterate over indices of tab2,
        // because it is biggest array
        .range(0, tab2.length).mapToObj(i ->
                IntStream.range(0, tab2[i].length).map(j ->
                        // for each cell concatenate element
                        // from tab2 with element from tab1
                        // if exists, or with 0 otherwise
                        IntStream.of(tab2[i][j],
                                i < tab1.length && j < tab1[i].length ?
                                        tab1[i][j] : 0)
                                // sum of two
                                // elements
                                .sum())
                        .toArray())
        .toArray(int[][]::new);
Arrays.stream(tab3).map(Arrays::toString).forEach(System.out::println);
// [3, 7, 11, 15, 9]
// [3, 7, 11, 15, 9]
// [3, 7, 11, 15, 9]
// [1, 3, 5, 7, 9]

See also:
Adding up all the elements of each column in a 2d array
Rotating an int Array in Java using only one semicolon

Вы можете использовать метод Stream#reduce для суммирования двух или более массивов:

public static int[][] sumArrays(int[][]... arrays) {
    return Arrays.stream(arrays).reduce((arr1, arr2) -> IntStream
        // iterate over the indices of
        // the rows of the largest array
        .range(0, Math.max(arr1.length, arr2.length))
        .mapToObj(i -> IntStream
            // iterate over the indices of
            // the cells of the largest row
            .range(0, Math.max(
                    i < arr1.length ? arr1[i].length : 0,
                    i < arr2.length ? arr2[i].length : 0))
            // sum the elements of two rows if exist, or 0 otherwise
            .map(j -> (i < arr1.length && j < arr1[i].length ? arr1[i][j] : 0) +
                    (i < arr2.length && j < arr2[i].length ? arr2[i][j] : 0))
            .toArray())
        .toArray(int[][]::new))
        .orElse(null);
}
public static void main(String[] args) {
    int[][] tab0 = {
            {3, 5, 7},
            {3, 5, 7}};

    int[][] tab1 = {
            {2, 4, 6, 8},
            {2, 4, 6, 8},
            {2, 4, 6, 8}};

    int[][] tab2 = {
            {1, 3, 5, 7, 9},
            {1, 3, 5, 7, 9},
            {1, 3, 5, 7, 9},
            {1, 3, 5, 7, 9}};

    int[][] tab3 = sumArrays(tab0, tab1, tab2);

    // formatted output
    Arrays.stream(tab3).map(row -> Arrays.stream(row)
            .mapToObj(i -> String.format("%2d", i))
            .collect(Collectors.joining(", ", "{", "}")))
            .forEach(System.out::println);
}

Выход:

{ 6, 12, 18, 15,  9}
{ 6, 12, 18, 15,  9}
{ 3,  7, 11, 15,  9}
{ 1,  3,  5,  7,  9}

Простая проверка того, что i (первое измерение) и j (второе измерение) не превышают длины вкладок tab1, должна помочь.

private static int[][] summary(int[][] tab1, int[][] tab2, int x) {
        var finalTab = new int[4][5];
        if (x > 0) {
            var tab1SecondDimensionLength = tab1[0].length;
            for(var i = 0; i < finalTab.length; ++i) {
                for(var j = 0; j < finalTab[i].length; ++j) {
                    var tab1Val = i < tab1.length ? j >= tab1SecondDimensionLength ? 0 : tab1[i][j] : 0;
                    
                    if (tab1Val > 0) {
                        finalTab[i][j] = tab1Val + tab2[i][j];
                    } else {
                        finalTab[i][j] = tab2[i][j];
                    }
                }
            }
            
            for (int i = 0; i < finalTab.length; i++) {
                for (int j = 0; j < finalTab[i].length; j++) {
                    System.out.print(" " + finalTab[i][j] + " ");
                }
                System.out.println();
            }
        }
        
        return finalTab;
    }

Выход:

3  7  11  15  9
3  7  11  15  9
3  7  11  15  9
1  3  5  7  9

Другие вопросы по теме