如何获得二维数组中每一列和每一行的总和?

Posted

技术标签:

【中文标题】如何获得二维数组中每一列和每一行的总和?【英文标题】:How to get the sum of each column and row in 2d array? 【发布时间】:2021-08-13 08:15:36 【问题描述】:

我有一个 7 x12 的二维数组。我被困在如何获得每列和每行的总和并将每个结果放入列表中,一个带有每列总和的结果,另一个带有每一行的结果。

所以,对于列,我想将每一列的结果保存在一个临时整数变量中,用 'a' 在每一行中迭代,当 'a' 等于 12(即行数)时,然后检查'p'(即列数)是否等于7并退出循环(这意味着每列的总和已添加到新数组中),如果不是,则将临时变量添加到新数组,临时变量和 'a' 将重置,因此循环可以重新开始并将 p 加一以获得下一行的总和。

for (int a = 0; a < 12; a++)
        
            int sum =+ students[a, p];

            if(a == 12)
            
                if (p == 7)
                
                    break;
                

                sum_columns.Add(sum);
                sum = 0;
                a = 0;
                p++;

            
        

谢谢大家!

【问题讨论】:

在第 3 行你有 =+ 而不是 +==+ 只会在每次迭代时将 sum 的值设置为正 [a,p],而不是将 [a,p] 添加到总和中。 【参考方案1】:

您可以根据需要简单地进行迭代。无需复杂的条件或重置:

for (int col = 0; col < 7; ++col) // iterate through the columns

    int sum = 0;
    for (int row = 0; row < 12; ++row) // iterate through the rows in the column and sum
    
        sum += students[row, col];
    
    sum_columns.Add(sum); // add sum to the list

Try it online

【讨论】:

【参考方案2】:

不是最有效的,但允许您抓取特定的行或列。

class Program

    static IEnumerable<T> GetRow<T>(T[,] someArray, int row)
    
        for (int i = 0; i <= someArray.GetUpperBound(1); i++)
            yield return someArray[row, i];
    

    static IEnumerable<T> GetColumn<T>(T[,] someArray, int column)
    
        for (int i = 0; i <= someArray.GetUpperBound(0); i++)
            yield return someArray[i, column];
    

    static void Main(string[] args)
    
        int[,] someArray = new int[4, 2]
            
                 1, 2 ,
                 3, 4 ,
                 5, 6 ,
                 7, 8 
            ;
        int rows = someArray.GetUpperBound(0) + 1;
        int columns = someArray.GetUpperBound(1) + 1;
        for (int i = 0; i < rows; i++)
            Console.WriteLine($"Row i sum is GetRow(someArray, i).Sum()");
        for (int i = 0; i < columns; i++)
            Console.WriteLine($"Column i sum is GetColumn(someArray, i).Sum()");
    

输出:

Row 0 sum is 3
Row 1 sum is 7
Row 2 sum is 11
Row 3 sum is 15
Column 0 sum is 16
Column 1 sum is 20

【讨论】:

【参考方案3】:

使用 Linq,

 public int GetSumOfColumn(int[,] matrix, int columnNumber)
    
        return Enumerable.Range(0, matrix.GetLength(0))
                .Select(x => matrix[x, columnNumber])
                .Sum();
    

    public int GetSumOfRow(int[,] matrix, int rowNumber)
    
        return Enumerable.Range(0, matrix.GetLength(1))
                .Select(x => matrix[rowNumber, x])
                .Sum();
    

在单独的 for 循环中调用这些函数,我是为行做的,你可以尝试对列进行同样的操作。

    List<int> row_sum = new List<int>();
    for(var rowIndex = 0; rowIndex < 4; rowIndex++)
    
        var sum = GetSumOfRow(array, rowIndex);
        row_sum.Add(sum);
    
    Console.WriteLine(string.Join(Environment.NewLine, row_sum));

实现:.NET FIDDLE

参考:https://www.codegrepper.com/

【讨论】:

以上是关于如何获得二维数组中每一列和每一行的总和?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中,如何生成数组的排列,其中每一列和每一行只有一个元素?

将二维坐标转换为一维数组

C语言中如何取二维数组的一行(一列)?

如何获取二维数组的列数

2021-08-13:给定一个每一行有序每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。

爱消除游戏中的消除算法