Перебор элементов матрицы

Я пишу собственную реализацию хэш-карты, которая поддерживается матрицей (двумерным массивом). Я хочу перебирать элементы и печатать их, но не хочу печатать нулевые элементы.

Хеш-карта поддерживает только целые числа и вычисляет хэш-коды как входной мод 10. Он будет хранить эти целые числа внутри соответствующего индекса хэш-кода, а коллизии разрешаются путем итерации по подмассиву и помещения целого числа в следующий доступный индекс подмассива. Если максимальный индекс данного подмассива превышен, он создаст новый массив размером в 1,5 раза больше исходного и скопирует в него элементы.

Проблема в том, что System.out.print будет выдавать ArrayIndexOutOfBoundsException каждый раз, когда iterator равно длине подмассива, поэтому цикл while не работает должным образом.

Я уже пытался изменить цикл while таким образом, чтобы переменная итератора была меньше максимального индекса каждого подмассива. Изменение условия на iterator < array[i].length - 1 позволит избежать исключения, но Java не будет печатать последний элемент каждого подмассива.

public void print () {
        int iterator = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == null)
                continue;
            System.out.print("[");
            while (array[i][iterator] != null && iterator < array[i].length) {
                System.out.print(array[i][iterator] + ", ");
                iterator++;
            }
            System.out.println ("]");
            iterator = 0;
        }
    }

Вывод должен быть примерно таким

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, ]
[1, 11, 21, 31, 41, 51, 61, 71, 81, 91, ]...

Но фактический результат

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at regularexpression.HashMap.print(HashMap.java:42)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Измените порядок проверки на while(iterator < array[i].length && array[i][iterator] != null) { ... }

Ответ принят как подходящий

Изменение этой строки должно исправить это:

     while (array[i][iterator] != null && iterator < array[i].length) {

к этому:

     while (iterator < array[i].length && array[i][iterator] != null) {

Спасибо! Ваше решение сработало. Влияет ли изменение порядка на приоритет логических операторов? Из-за этого петля продолжала давать сбои?

Nimbus 07.04.2019 22:11

Да, логическая операция И (&&) оценивает первое условие и оценивает второе только в том случае, если первое истинно, в вашем случае, когда iterator < array[i].length ложно, array[i][iterator] выдаст ArrayIndexOutOfBoundsException, поэтому важно оценить условия в этот порядок

Matias Fuentes 07.04.2019 22:15

&& — это короткий синтаксис AND. Если первый операнд ложен, второй операнд не вычисляется. И у вас была ошибка в вычислении массива [i] [iterator].

Dmitry Margolis 07.04.2019 22:15

@Nimbus Пожалуйста. Не стесняйтесь принять мой ответ, если он был полезен.

Matias Fuentes 07.04.2019 22:25

Другие вопросы по теме

Похожие вопросы