Я пишу собственную реализацию хэш-карты, которая поддерживается матрицей (двумерным массивом). Я хочу перебирать элементы и печатать их, но не хочу печатать нулевые элементы.
Хеш-карта поддерживает только целые числа и вычисляет хэш-коды как входной мод 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)
Измените порядок проверки на 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) {
Да, логическая операция И (&&) оценивает первое условие и оценивает второе только в том случае, если первое истинно, в вашем случае, когда iterator < array[i].length
ложно, array[i][iterator]
выдаст ArrayIndexOutOfBoundsException
, поэтому важно оценить условия в этот порядок
&& — это короткий синтаксис AND. Если первый операнд ложен, второй операнд не вычисляется. И у вас была ошибка в вычислении массива [i] [iterator].
@Nimbus Пожалуйста. Не стесняйтесь принять мой ответ, если он был полезен.
Спасибо! Ваше решение сработало. Влияет ли изменение порядка на приоритет логических операторов? Из-за этого петля продолжала давать сбои?