Вы должны использовать Iterator
или, что еще лучше, расширенный синтаксис цикла for (который зависит от класса, реализующего интерфейс Iterable
), независимо от Collection
вы используете. Это абстрагирует механизм, используемый для обхода коллекции, и позволяет заменить новую реализацию, не затрагивая процедуру итерации.
Например:
Set<Foo> set = ...
// Enhanced for-loop syntax
for (Foo foo : set) {
// ...
}
// Iterator approach
Iterator it = set.iterator();
while (it.hasNext()) {
Foo foo = it.next();
}
EDIT
Кан делает хорошие замечания относительно изменения ключа предмета. Предполагая, что методы equals()
и hashCode()
вашего класса основаны исключительно на атрибуте "id" (который вы изменяете), самым безопасным подходом было бы явное удаление их из Set
во время итерации и добавление их в «вывод» Set
; например,
SortedSet<Foo> input = ...
SortedSet<Foo> output = new TreeSet<Foo>();
Iterator<Foo> it = input.iterator();
while (it.hasNext()) {
Foo foo = it.next();
it.remove(); // Remove from input set before updating ID.
foo.setId(1);
output.add(foo); // Add to output set.
}