Java - Найти строку и столбец с максимальной суммой - PullRequest
0 голосов
/ 11 декабря 2018

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

В настоящее время у меня есть первая часть программы, но я не могу найти решение для второй части, которая заключается в поиске строкии столбец с наибольшей суммой.

Желаемый результат

Я новичок в этом, поэтому любые советы будут оценены.

Этопервая часть моего кода:

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.");
        }

    }
}

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Вы можете использовать следующую логику и реализовать ее по своему усмотрению.

    // 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 для хранения индексасамый высокий ряд.То же самое относится и к колонке.

0 голосов
/ 11 декабря 2018

Вот метод, который сначала вычисляет суммы как по строкам, так и по столбцам в одном цикле (тот же, который используется для поиска максимальной суммы строк), а второй - для поиска максимальной суммы столбцов:

//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]);
}
0 голосов
/ 11 декабря 2018

Вы можете использовать целые числа, одно для строки (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.");
    }
...