Почему мой Java-код внутри цикла ведет себя по-разному при проверке условий с помощью HashSet?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему мой Java-код внутри цикла ведет себя по-разному при проверке условий с помощью HashSet?

Сообщение Anonymous »

Я пытаюсь решить проблему с кодированием, когда мне нужно многократно удваивать число (

Код: Выделить всё

original
), если он существует в целочисленном массиве. Чтобы ускорить поиск, я вставляю все элементы массива в HashSet. Насколько я понимаю, это должно позволять проводить проверки contains() в постоянное время.
Однако, когда я помещаю условие удвоения внутри цикла, который создает набор, мой код завершается сбоем на определенных входных данных. Вот код:

Код: Выделить всё

public int findFinalValue(int[] nums, int original) {
Set set = new HashSet();
for (int num : nums) {
set.add(num);
if (set.contains(original)) {
original *= 2;
}
}
return original;
}
Например, если nums = [5,3,6,1,12] и original = 3, этот код возвращает 12, но правильный результат должен быть 24, потому что 3 → 6 → 12 → 24 (все появляются в массиве).
Когда я перемещаю условие за пределы цикла следующим образом:

Код: Выделить всё

while (set.contains(original)) {
original *= 2;
}
…он работает правильно.
Мой вопрос:
Почему проверка contains(original) внутри того же цикла, в котором создается набор, вызывает некорректное поведение?

Я предположил, что добавление элементов один за другим и проверка в одном и том же проходе должны логически работать, поскольку в конечном итоге строится один и тот же набор.
Есть ли какие-либо подробности о порядке итерации, времени выполнения обновления или поведение HashSet, которое я неправильно понимаю?
Любое объяснение того, почему логика работает только после создания полного набора, будет очень признательно.

Подробнее здесь: https://stackoverflow.com/questions/798 ... conditions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»