Неверно осуществляется поиск индекса в двумерном массиве

Рейтинг: 0Ответов: 1Опубликовано: 30.07.2023

Есть задание:
Создайте класс с именем Location для нахождения наибольшего элемента и его позиции в двумерном массиве.
Класс должен содержать public-поля row, column и maxValue, в которых будут храниться наибольший элемент типа double и его индексы в двумерном массиве со строчками и столбцами типа int.

Напишите следующий метод, который возвращает позицию наибольшего элемента в двумерном массиве:

public static Location locateLargest(double[][] a)
Возвращаемое значение должно быть типа Location. Напишите клиент этого класса — программу, которая предлагает пользователю ввести двумерный массив и отображает позицию наибольшего элемента в этом массиве. Пример выполнения программы:

Введите количество строчек и столбцов массива: 3 4
Введите массив:
23.5 35 2 10
4.5 3 45 3.5
35 44 5.5 9.6
Наибольший элемент массива, равный 45.0, находится в позиции (1, 2)

Вот код:

import java.util.Scanner;
    
public class Location {
    public int row, column;
    public static double maxValue;
    
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
    
        System.out.println("Введите кол-во строчек и столбцов массива: ");
        int row = input.nextInt();
        int column = input.nextInt();
    
        System.out.println("Введите массив: ");
        double[][] array = getArray(row, column);

        Location l = new Location();
    
        System.out.println("Наибольший элемент массива, равный, " + locateLargest(array) + " находится в позиции " + row + ", " + column);
    }
    // считаем кол-во строчек и столбцов
    public static double[][] getArray(int row, int column) {
        Scanner input = new Scanner(System.in);
        double[][] a = new double[row][column];
        for (row = 0; row < a.length; row++) {
            for (column = 0; column < a[row].length; column++) {
                a[row][column] = input.nextDouble();
            }
        }
        return a;
    }
    // наибольший элемент в массиве
    public static double locateLargest(double[][] a) {
        int rowIndex = 0;
        int columnIndex = 0;
        double max = a[rowIndex][columnIndex];
        for (int i = 0; i < a.length; i++)
            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j] > max)
                    max = a[i][j];
                rowIndex = i;
                columnIndex = j;
            }
            return max; // что вернуть?
        }
    }

Почему неверно считается индекс нахождения числа? В чем ошибка в коде?

import java.util.Scanner;
    
public class Location {
    public int row, column;
    public double maxValue;
    
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Введите кол-во строчек и столбцов массива: ");
        int row = input.nextInt();
        int column = input.nextInt();
    
        System.out.println("Введите массив: ");
        double[][] array = getArray(row, column);
        Location l = locateLargest(getArray(row, column));
        System.out.println("Наибольший элемент массива, равный, " + l.maxValue + " находится в позиции " + l.row + ", " + l.column);
    }
    
    public Location (int newRow, int newColumn, double newMaxValue) {
        row = newRow;
        column = newColumn;
        maxValue = newMaxValue;
    }
    // находим наибольший элемент
    public static Location locateLargest(double[][] a) {
        int rowIndex = 0;
        int columnIndex = 0;
        double max = a[0][0];
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j] > max)
                    max = a[i][j];
                rowIndex = i;
                columnIndex = j;
            }
        }
        Location l = new Location(rowIndex, columnIndex, max);
        return l;
    }
    
    // считаем кол-во строчек и столбцов
    public static double[][] getArray(int row, int column) {
        Scanner input = new Scanner(System.in);
        double[][] a = new double[row][column];
        for (row = 0; row < a.length; row++) {
            for (column = 0; column < a[row].length; column++) {
                a[row][column] = input.nextDouble();
            }
        }
        return a;
    }
}

Код переписала. НО возникает ошибка при указании в массиве нецелочисленных значений. При указании целочисленных все в порядке:

Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:947)
    at java.base/java.util.Scanner.next(Scanner.java:1602)
    at java.base/java.util.Scanner.nextDouble(Scanner.java:2573)
    at Location.getArray(Location.java:48)
    at Location.main(Location.java:15)

Ответы

▲ 0Принят

Основная проблема с поиском индексов максимума в том, что в обоих вариантах кода оператор if относится только к одной строке кода, где запоминается максимальное значение. Индексы же будут обновляться при каждой проверке и фактически получается размер матрицы.

Это место следует переписать:

// ...
if (a[i][j] > max) {
    max = a[i][j];
    rowIndex = i;
    columnIndex = j;
}
// ...

Вторая проблема со вводом связана с созданием ненужного второго экземпляра сканера, лучше переписать код чтения массива, чтобы изолировать в нём весь ввод/вывод:

    public static double[][] getArray() {
        Scanner input = new Scanner(System.in);
        System.out.println("Введите кол-во строчек и столбцов массива: ");
        int row = input.nextInt();
        int column = input.nextInt();
    
        System.out.println("Введите массив размером " + row + " x " + column + ": ");
        
        double[][] a = new double[row][column];
        for (row = 0; row < a.length; row++) {
            for (column = 0; column < a[row].length; column++) {
                a[row][column] = input.nextDouble();
            }
        }
        return a;
    }

И последний момент -- во втором исправленном варианте кода метод getArray, вычитывающий входной массив, вызывается дважды, что явно неправильно, например, если какой-нибудь автоматизированный тест подаст на вход только один массив.

Исправленный вариант с учётом переделанного метода getArray тривиален.

public static void main(String[] args) {
    Location l = locateLargest(getArray());
    System.out.println("Наибольший элемент массива, равный, " + l.maxValue + " находится в позиции " + l.row + ", " + l.column);
}