Java-查找具有最大和的行和列

时间:2018-12-11 18:48:29

标签: java matrix sum row highest

正如标题所述,我想知道一种方法(在Java中),以找出哪一行(在矩阵/ 2D数组中)和列的总和最高。 可能有一个简单的解决方案,但我一直在努力寻找它。

我目前有该程序的第一部分,但似乎找不到第二部分的解决方案,即找到总和最高的行和列。

Desired output

我是一个初学者,所以任何建议都会受到赞赏。

这是我代码的第一部分:

import javax.swing.JOptionPane;

public class summat{
    public static void main(String[] args){
        int mat[][] = new int [3][3];
        int num, sumop, sumw, i, j, mayop = 0, mayw = 0;

        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                String input = JOptionPane.showInputDialog(null, "Products sold by the operator " +  (i+1) + " in week " + (j+1) + ".");
                mat[i][j] = Integer.parseInt(input);
            }
        }

        /*Sum of individual rows*/
        for(i=0;i<3;i++){
            sumop = 0;
            for(j=0;j<3;j++){
                sumop = sumop + mat[i][j];
            }
            JOptionPane.showMessageDialog(null, "The operator " + (i+1) + " sold " + sumop + " units.");
        }

        /*Sum of individual columns*/
        for(j=0;j<3;j++){
            sumw = 0;
            for(i=0;i<3;i++){
                sumw = sumw + mat[i][j];
            }
            JOptionPane.showMessageDialog(null, "In week " + (j+1) + " the company sold " + sumw + " units.");
        }

    }
}

4 个答案:

答案 0 :(得分:1)

public static void method(int[] arr, int row, int col) {
    // converting array to matrix
    int index = 0;
    int mat[][] = new int[row][col];
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            mat[i][j] = arr[index];
            index++;
        }
    }
    // calculating sum of each row and adding to arraylist
    ArrayList<Integer> rsum = new ArrayList<Integer>();
    for (int i = 0; i < row; i++) {
        int r = 0;
            for (int j = 0; j < col; j++) {
            r = r + mat[i][j];
            }
        rsum.add(r);
    }
    // calculating sum of each col and adding to arraylist
    ArrayList<Integer> csum = new ArrayList<Integer>();
    for (int i = 0; i < row; i++) {
        int sum = 0;
        for (int j = 0; j < col; j++) {
            sum = sum + mat[j][i];
            }
        csum.add(sum);
        }
    System.out.println(
            "Maximum row sum is " + Collections.max(rsum) + " at row " + rsum.indexOf(Collections.max(rsum)));
    System.out.println(
            "Maximum col sum is " + Collections.max(csum) + " at col " + csum.indexOf(Collections.max(csum)));   
}

public static void method(int[][] mat, int row, int col) {

    // calculating sum of each row and adding to arraylist
    ArrayList<Integer> rsum = new ArrayList<Integer>();
    for (int i = 0; i < row; i++) {
        int r = 0;
        for (int j = 0; j < col; j++) {
            r = r + mat[i][j];
        }
        rsum.add(r);
    }
    // calculating sum of each col and adding to arraylist
    ArrayList<Integer> csum = new ArrayList<Integer>();
    for (int i = 0; i < row; i++) {
        int sum = 0;
        for (int j = 0; j < col; j++) {
            sum = sum + mat[j][i];
        }
        csum.add(sum);
    }
    System.out.println(
            "Maximum row sum is " + Collections.max(rsum) + " at row " + rsum.indexOf(Collections.max(rsum)));
    System.out.println(
            "Maximum col sum is " + Collections.max(csum) + " at col " + csum.indexOf(Collections.max(csum)));
}

答案 1 :(得分:0)

您必须为row(maxRow)整数一个,为col(maxCol)整数一个,以保持最大值:

    int maxRow = Integer.MIN_VALUE;
    /*Sum of individual rows*/
    for(i=0;i<3;i++){
        sumop = 0;
        for(j=0;j<3;j++){
            sumop = sumop + mat[i][j];
        }
        if(maxRow > sumop)
            maxRow = sumop;
        JOptionPane.showMessageDialog(null, "The operator " + (i+1) + " sold " + sumop + " units.");
    }

    int maxCol = Integer.MIN_VALUE;
    /*Sum of individual columns*/
    for(j=0;j<3;j++){
        sumw = 0;
        for(i=0;i<3;i++){
            sumw = sumw + mat[i][j];
        }
        if(maxCol > sumw)
            maxCol = sumw;
        JOptionPane.showMessageDialog(null, "In week " + (j+1) + " the company sold " + sumw + " units.");
    }

答案 2 :(得分:0)

您可以使用以下逻辑并根据需要实施。

    // Row calculation
    int rowSum = 0, maxRowSum = Integer.MIN_VALUE, maxRowIndex = Integer.MIN_VALUE;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            rowSum = rowSum + mat[i][j];
        }
        if (maxRowSum < rowSum) {
            maxRowSum = rowSum;
            maxRowIndex = i;
        }
        rowSum = 0;   // resetting before next iteration
    }

    // Column calculation
    int colSum = 0, maxColSum =  Integer.MIN_VALUE, maxColIndex = Integer.MIN_VALUE;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            colSum = colSum + mat[j][i];
        }
        if (maxColSum < colSum) {
            maxColSum = colSum;
            maxColIndex = i; 
        }
        colSum = 0;    // resetting before next iteration
    }

    System.out.println("Row " + maxRowIndex + " has highest sum = " +maxRowSum);
    System.out.println("Col " + maxColIndex + " has highest sum = " +maxColSum);

在这里,我们使用两个附加变量maxRowSum来存储行的最高和,而maxRowIndex来存储最高行的索引。列也是如此。

答案 3 :(得分:0)

这是一种方法,它首先在一个循环中计算行和列总和(用于查找最大行总和的是同一循环),然后在第二个循环中计算最大列总和:

//This returns an array with {maxRowIndex, maxColumnIndex}
public static int[] findMax(int[][] mat) {
    int[] rowSums = new int[mat.length];
    int[] colSums = new int[mat[0].length];

    int maxRowValue = Integer.MIN_VALUE;
    int maxRowIndex = -1;

    for (int i = 0; i < mat.length; i++) {
        for (int j = 0; j < mat[i].length; j++) {
            rowSums[i] += mat[i][j];
            colSums[j] += mat[i][j];
        }

        if (rowSums[i] > maxRowValue) {
            maxRowIndex = i;
            maxRowValue = rowSums[i];
        }

        // display current row message
        JOptionPane.showMessageDialog(null, "The operator " +
                (i + 1) + " sold " + rowSums[i] + " units.");
    }

    int maxColumnValue = Integer.MIN_VALUE;
    int maxColumnIndex = -1;

    // look for max column:
    for (int j = 0; j < mat[0].length; j++) {
        if (colSums[j] > maxColumnValue) {
            maxColumnValue = colSums[j];
            maxColumnIndex = j;
        }

        // display column message
        JOptionPane.showMessageDialog(null, "In week " + 
        (j + 1) + " the company sold " + colSums[j] + " units.");
    }

    return new int[] { maxRowIndex, maxColumnIndex };
}

以下测试(我必须对矩阵值进行硬编码)产生[2,2]:

public static void main(String[] args) {
    int mat[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

    int[] maxValues = findMax(mat);
    System.out.println("Max row index: " + 
       maxValues[0] + ". Max Column index: " + maxValues[1]);
}