найти наибольшее число в столбце и строке в массиве - PullRequest
0 голосов
/ 20 ноября 2018

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

for (int i = 0; i < Array1.length; i++) {
    for (int j = 0; j < Array1[0].length; j++) {
        if (Array1[i][j] > rowMax) {
            rowMax = Array1[i][j];
            column = j;
        }
    }

    for (int k = 0; k < Array1.length; k++) {
        if (Array1[k][column] > rowMax) {
            columnMax = Array1[k][column];
        }
    }

    if (rowMax > columnMax) {
        max = rowMax;
        System.out.println("The max number is " + max + " in [" + i + "][" + column + "]");
    } else {
        max = columnMax;
        System.out.println("The max number is " + max + " in [" + i + "][" + column + "]");
    }

    max = 0;
}

ожидаемый результат должен выглядеть следующим образом:

99 28 45 62 89
41 85 22 12 20
10 11 15 13 90

на выходе будет 99 , 85 и 90 , поскольку 99 - самый большой в первом ряду и первом столбце, 85 - самый большой во втором ряду и во втором столбце и т. Д.
, но с другой стороны,моя программа выводится так ..

Максимальное число 99 в [0] [0]
Максимальное число 99 в [1] [0]
Максимальное число99 в [2] [0]

что не так в моем исходном коде?

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Вы можете сделать свою жизнь намного проще, используя структуру данных, в которой хранятся ваши максимумы для каждой строки и столбца.Возьмите два Map<Integer, Integer> и сохраните номер строки соответственно номер столбца в качестве ключа и максимальное значение в качестве значения.Вы можете обновить их в каждой итерации, если это необходимо.После этого просто распечатайте их:

public static void main(String[] args) {

    int[][] arrayOne = new int[][] { 
        {  1, 3, 54, 25, 22 },
        { 67, 2,  0, 77, 10 },
        {  2, 4, 55, 26, 23 },
        { 65, 1, 99, 88, 11 }
    };

    // data structures that hold the row or column number and the corresponding maximum value
    Map<Integer, Integer> rowMaxima = new HashMap<Integer, Integer>();
    Map<Integer, Integer> columnMaxima = new HashMap<Integer, Integer>();

    // iterate over the rows
    for (int row = 0; row < arrayOne.length; row++) {

        // for every row, iterate over the columns
        for (int column = 0; column < arrayOne[row].length; column++) {
            // print the values in order to see if the iteration is correct
            System.out.println("arrayOne[" + row + "][" + column + "] is " + arrayOne[row][column]);

            // update the value of the current row's maximum value
            if (rowMaxima.get(row) == null || arrayOne[row][column] > rowMaxima.get(row)) {
                rowMaxima.put(row, arrayOne[row][column]);
            }

            // update the value of the current column's maximum value
            if (columnMaxima.get(column) == null || arrayOne[row][column] > columnMaxima.get(column)) {
                columnMaxima.put(column, arrayOne[row][column]);
            }
        }
    }

    // print all maxima of the rows
    rowMaxima.forEach((key, value) -> {
        System.out.println("Maximum value of row " + key + " is " + value);
    });

    // print all maxima of the columns
    columnMaxima.forEach((key, value) -> {
        System.out.println("Maximum value of column " + key + " is " + value);
    });
}

Обратите внимание, что проверка на null необходима из-за пустого Map в начале, что в противном случае приведет к NullPointerException в rowMaxima.get(row).

0 голосов
/ 20 ноября 2018

Array1 имеет три строки и пять столбцов.Глядя на желаемый результат, должно быть три значения.Ваш код работает строка за строкой.Но переменные rowMax и columnMax устанавливаются для всего массива, а не для каждой строки или каждого столбца.Таким образом, они устанавливаются на максимальное значение таблицы, равное 99.Поскольку это значение появляется уже в первой строке, и вы печатаете максимальное число для каждой строки, оно никогда не меняется на более высокое значение.

Используя потоки Java8 +, мы можем упростить логику с помощью метода IntStream.max,Мы можем разбить общую задачу на две меньшие задачи: найти максимум в строке и найти максимум в столбце.

protected static int getMaxOfRow(int[][] table, int row) {
    return Arrays.stream(table[row]).max().getAsInt();
}

protected static int getMaxOfColumn(int[][] table, int column) {
    return IntStream.range(0, table.length).map(i -> table[i][column]).max().getAsInt();
}

На основании этого мы можем определить метод для получения максимума строкии столбец с определенным индексом:

protected static int getMaxOfRowColumn(int[][] table, int index) {
    return Math.max(getMaxOfRow(table, index), getMaxOfColumn(table, index));
}

Применение по вашему примеру:

public static void main(String[] args) {
    int[][] table = new int[3][];
    table[0] = new int[] { 99, 28, 45, 62, 89 };
    table[1] = new int[] { 41, 85, 22, 12, 20 };
    table[2] = new int[] { 10, 11, 15, 13, 90 };

    for (int i = 0; i < table.length; i++) {
        int max = getMaxOfRowColumn(table, i);
        System.out.println(max);
    }
}

Вывод:

99
85
90

РЕДАКТИРОВАТЬ:
ЕслиВы не хотите использовать Stream, просто реализуйте первые два метода, используя цикл for.Вы по-прежнему сохраняете читабельный дизайн.

protected static int getMaxOfRow(int[][] table, int row) {
    int[] r = table[row];
    int max = r[0];
    for (int i = 1; i < r.length; i++) {
        if (max < r[i]) {
            max = r[i];
        }
    }
    return max;
}

protected static int getMaxOfColumn(int[][] table, int column) {
    int max = table[0][column];
    for (int i = 1; i < table.length; i++) {
        if (max < table[i][column]) {
            max = table[i][column];
        }
    }
    return max;
}

Обратите внимание: для этого кода требуется массив по крайней мере с одной строкой и одним столбцом.Неинициализированный массив или пустой массив или массив с пустой строкой вызовет исключение.

0 голосов
/ 20 ноября 2018

Вы должны сбросить до 0 эти переменные rowMax, column, columnMax и max перед каждой итерацией, потому что теперь вы сохраняете значение rowMax как 99.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...