2010-02-21 3 views
2

Я пытаюсь реализовать алгоритм, который многократно применяет операции над Collection (в настоящее время List). На каждом этапе Элементы могут быть добавлены, удалены и изменены (с использованием геттеров и сеттеров) в коллекции. Алгоритм повторяется до тех пор, пока не будут внесены изменения в сборку на предыдущем шаге.Java: Внедрение коллекции «repeat until no change»

Порядок элементов не имеет отношения к делу. Однако модифицированный или созданный элемент не должен быть доступен до следующего цикла.

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

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

Любая помощь будет действительно оценена!

ответ

4

Я бы просто использовал логическую переменную, которая установлена ​​в значение false в начале основного цикла. Когда во внутреннем цикле внесено изменение в список, это может быть установлено в true, если никаких изменений не будет сделано, он останется ложным. Основной цикл может продолжить цикл, если это верно или завершение цикла в противном случае

+0

+1 - это самое простое и эффективное решение на долгий путь. –

0

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

1

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

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

runAlgo(Collection c) { 
    // do work 

    if (collectionUpdated) 
    return runAlgo(c); // potential stackoverflow with huge collection or too many calls from lots of collection updates 
    else 
    return c; 
} 
Смежные вопросы