Условие прекратить Java-итерацию - PullRequest
2 голосов
/ 24 мая 2011

Добрый вечер.У меня проблемы с поиском условия, которое остановило бы цикл внутри моей программы.Я постараюсь объяснить это как можно более широко, поэтому вопрос может помочь другим в такой же ситуации:

У меня есть коллекция объектов.
С фрагментом кода внутри цикла я генерирую больше объектов.
Я хочу добавить эти объекты в коллекцию.
Как только они будут добавлены, я бы хотел перебрать их, ЕСЛИ они не были перебраны ранее.

Псевдокод:

While (!everyObjectHasBeenIteratedOver){
    for (Object o : SetOfObjects){
        // Generate an unknown number of objects
        // Add those objects to the SetOfObjects unless they're already there
    }
}

Вот и все.Единственный ответ, который я знаю, - это использование списков, которые поддерживают добавление элементов в список итерации без разбивки, однако я лично использую HashSets.

Есть идеи?

Спасибо заранее.

РЕДАКТИРОВАТЬ: Завершено использование набора для посещенных объектов и еще один для не посещенных.
Условие: while (!notVisited.isEmpty()) {...}

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Предлагаю использовать 2 коллекции: посещенные и toBeVisited.Посещенные могут быть Set и toBeVisited - Очередь.Таким образом, вы добавляете новые элементы в очередь, только если они еще не посещены.И когда вы добавляете элемент в очередь, вы также добавляете его в набор.

1 голос
/ 24 мая 2011

Я бы взял рекурсивный подход

public doSomething(Collection<Object> doTo, Set<Object> beenDone) {
  for(Object o : collection) {
    Collection<Object> newObjects = createObjects(0);
    doSomething(newObjects,beenDone);
    beenDone.add(o);
  }
   return beenDone;
}

public mainIteration(Collection<Object> collection) {
  Set<Object> operatedOn = new HashSet<Object>();
  doSomething(collection,operatedOn);
}
1 голос
/ 24 мая 2011

Добавление к набору ничего не даст, если объект уже существует.Так что это не должно быть проблемой.Если объект имеет ту же самую идентичность (не забудьте переопределить hashCode() и equals(..)), но другие другие поля, вы можете проверить с помощью set.contains(..)

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

...