【问题标题】:Sum of 2 different 2D arrays2个不同二维数组的总和
【发布时间】:2021-03-30 01:12:34
【问题描述】:

我需要帮助编写一个方法来找出 2 个不同大小的二维数组的总和。

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 的索引对应的数字?

【问题讨论】:

    标签: java arrays matrix multidimensional-array sum


    【解决方案1】:

    你可以做得更通用

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

    【讨论】:

      【解决方案2】:

      这是一个更直接的解决方案:

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

      【讨论】:

        【解决方案3】:

        您可以使用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]
        

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

        【讨论】:

          【解决方案4】:

          我是这样弄的:

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

          【讨论】:

            【解决方案5】:

            您可以使用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}
            

            【讨论】:

              【解决方案6】:

              只需检查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
              

              【讨论】:

                猜你喜欢
                • 2021-02-09
                • 1970-01-01
                • 1970-01-01
                • 2016-08-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-07-05
                • 2013-03-16
                相关资源
                最近更新 更多