Проблема возникает, когда s1
и s2
имеют разную длину. Эти линии имеют недостатки:
IntegerSet union = new IntegerSet(Math.max(s1.dMax, s2.dMax));
for (int i = 0; i < (Math.max(s1.dMax, s2.dMax)); i++) {
Подумайте о том, каких две группы неравной длиной выглядит как: (используя 1 и 0 вместо true
и false
)
s1: {0 1 0 0 1 1} length = 6
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
Вы программироваться своим циклом в итерация от 0 до максимум длина двух наборов, которая в приведенном выше примере равна 12 (это означает, что последнее значение, которое будет использовать ваш цикл, равно 11). Но s1
всего 6 элементов - последний действующий индекс - 5! По мере того как цикл ошибочно пытается получить доступ к элементам 7 через 12 (индексы 6 по 11) из s1
, он бросает ArrayIndexOutOfBoundsError.
Чтобы это исправить, необходимо использовать минимальной длину двух множеств в обеих линиях, где вы используете максимум. Таким образом, вы будете принимать в союз:
s1: {0 1 0 0 1 1} length = 6
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1} length = min(6, 12) = 6
Вместо
s1: {0 1 0 0 1 1}! ! ! ! ! ! length = 6; no elements 7 through 12!
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1 ! ! ! ! ! !} length = max(6, 12) = 12 -> errors
Это оставляет позднюю часть s2
из союза, так как нет соответствующих элементов в s1
не выполнить логическое ||
с. Тем не менее, вы можете также сделать что-то вроде этого:
IntegerSet union = new IntegerSet(Math.max(s1.dMax, s2.dMax));
for (int i = 0; i < (Math.max(s1.dMax, s2.dMax)); i++) {
if (s2.set.length > s1.set.length)
{
union.set[i] = s2.set[i] || (i < s1.set.length ? s1.set[i] : false);
}
else
{
union.set[i] = s1.set[i] || (i < s2.set.length ? s2.set[i] : false);
}
}
Это будет использовать false
«S для каждого недостающего элемента в более короткий набор, в результате чего накидной существа:
s1: {0 1 0 0 1 1} length = 6
s2: {1 1 1 0 0 0 1 0 1 1 0 1} length = 12
union: {1 1 1 0 1 1 1 0 1 1 0 1} length = max(6, 12) = 12
Все записи просто скопированной от более длинного набора, так как anything || false
сам по себе.
Как вы думаете, а это значит?Как только вы это знаете, вы можете работать назад, чтобы выяснить источник. –
Представьте себе, s1.dMax равно 10 и s2.dMax равно 20. Так что, если вы повторяете до Max (10,20), что равно 20, что произойдет с s1.set? – exception1
Вставьте вызовы в System.out.println, чтобы распечатать ваши значения, работая в обратном направлении от точки исключения. (Или используйте отладчик.) –