Книга: Основы программирования с Java
Назад: Break и сontinue
Дальше: Вопросы

Пример работы с двумерным массивом

Давайте посмотрим снова некоторые из методов, которые мы написали для одномерных массивов.





Это метод для вычисления среднего значения элементов в одномерном массиве.

Когда мы имеем дело с двумерными массивами, подумайте о том, что будет означать среднее для двумерного массива.

Подумайте о том, какой тип усреднения вы хотели бы получить для score массива, такого как этот.







Если предположить, что все тесты имеют одинаковый вес, вы можете вычислить среднее значение четырех тестов для каждого из студентов.

Вы можете вычислить взвешенное среднее, если они имеют разные веса.

Таким образом, вы хотите вычислить среднее строки.

Если вы хотите вычислить средний балл для конкретного теста, значит, вы хотите вычислить среднее столбца.

Также вы можете вычислить среднее значение для всех оценок, полученных всеми студентами.







Этот метод aveByRow вычисляет среднее строки 2D массива.

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

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

Затем вы должны определить количество столбцов для этой конкретной строки с помощью scores[row].length.

Вы можете также использовать scores[0].length, если все строки имеют одинаковое количество столбцов.

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

Первый индекс – это строка, которая задается в качестве параметра, и 2-й индекс «с» это индекс цикла, который проходит данную строку.

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

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







Число элементов, подлежащих включению в расчет среднего, это количество строк или scores.length.

Обратите внимание, чем это отличается от предыдущего метода, мы просто используем scores здесь без индекса.

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

Среднее столбца затем вычисляется и возвращается.

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

Это метод maxIndex, который мы обсуждали для нахождения местоположения максимального значения в одномерном массиве.







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

Этот метод maxRowIndex предназначен для нахождения местоположения максимального элемента для заданного столбца, который приведен в качестве параметра.







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

Так как мы будем вести цикл по строкам, максимальный размер будет scores.length.

Внутри цикла, единственная разница между этим и предыдущим методом, это то, что здесь есть два индекса для scores.

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

mIndex будет возвращен как результат в конце.

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

Демонстрация работы с двумерными массивами

Давайте рассмотрим краткую демонстрацию класса Scores, который мы только что обсуждали.

Откроем проект в IDEA.







Вот метод initializeAllScores, метод getScoresByIndices и метод printAllScores.

Так это должно быть таким же, как то, что мы только что обсуждали.

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







Это было бы то же самое, как вызов метода "initializeAllScores".

Скомпилируйте и запустите программу путем создания экземпляра, вызывая метод printAllScores, при этом отобразится вывод.







Значения, которые здесь печатаются, должны быть такими же, как начальные значения, определенные в массиве.

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

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







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

Это означает, что здесь есть только 3 элемента, а затем в третьей строке на 2 элемента.

Последняя строка, или 4-я строка имеет только 1 элемент.

Так что этот массив, если он работает, будет иметь разные столбцы для разных строк.

Давайте посмотрим, позволит ли Java нам сделать это.

Давайте скомпилируем программу; и она компилируется без проблем.

Так что теперь давайте попробуем запустить программу. При этом создается экземпляр объекта.

Если вы запустите программу с помощью метода printAllScores, будет ошибка.







Ошибка ArrayIndexOutOfBounds, и она появляется именно в том выражении, когда мы вызываем getScoreByIndices.

Мы получаем эту ошибку, потому что мы предполагаем, что все строки имеют одинаковое число столбцов, получаемое как scores[0].length.

Но на самом деле, массив имеет разное количество столбцов для разных строк.

Так как же нам это исправить?







Одним из способов исправить это, изменить numOfCols здесь, во внутреннем цикле для printAllScores, вместо использования numOfCols для всех строк, мы можем изменить это на scores[r].length.







С этим изменением, внутренний цикл будет ограничивать количество доступа к элементам в разных строках по количеству столбцов в этой строке, которое дается как scores[r].length.

И это даст нам число столбцов, с учетом индексации r, который является индексом строки.

Давайте снова скомпилируем и запустим программу путем создания экземпляра.

Если вы вызовете метод printAllScores снова, вы сможете увидеть, что результат печатается и имеет различное число элементов для разных строк, что то же самое, как массив был инициализирован.

Назад: Break и сontinue
Дальше: Вопросы