여기에는 두 가지 문제가 있습니다.
첫 번째 문제는에 추가 Collection
하는 것 Iterator
입니다. 언급 Collection
했듯이에 대한 설명서에 명시된대로 기본 이 수정 될 때 정의 된 동작이 없습니다 Iterator.remove
.
...이 메서드를 호출하는 것 이외의 방법으로 반복이 진행되는 동안 기본 컬렉션이 수정되면 반복기의 동작이 지정되지 않습니다.
두 번째 문제 는를 Iterator
획득 할 수 있고 동일한 요소로 돌아가 Iterator
더라도 Collection.iterator
메서드 문서에 언급 된대로 반복 순서에 대한 보장이 없다는 것입니다 .
... 요소가 반환되는 순서에 대한 보장이 없습니다 (이 컬렉션이 보장을 제공하는 일부 클래스의 인스턴스가 아닌 경우).
예를 들어 목록이 있다고 가정 해 보겠습니다 [1, 2, 3, 4]
.
하자 말은 5
(가) 때 추가 된 Iterator
있었다 3
, 어떻게 든, 우리는 얻을 Iterator
에서 반복을 재개 할 것을 4
. 그러나 5
이후에 올 보장은 없습니다 4
. 반복 순서는 [5, 1, 2, 3, 4]
다음과 같을 수 있습니다 . 그러면 반복기는 여전히 요소를 놓칠 것 5
입니다.
행동에 대한 보장이 없기 때문에 어떤 일이 일어날 것이라고 추측 할 수 없습니다.
한 가지 대안은 Collection
새로 생성 된 요소를 추가 할 수 있는 별도의 요소를 만든 다음 해당 요소를 반복하는 것입니다.
Collection<String> list = Arrays.asList(new String[]{"Hello", "World!"});
Collection<String> additionalList = new ArrayList<String>();
for (String s : list) {
additionalList.add(s);
}
for (String s : additionalList) {
System.out.println(s);
}
편집하다
Avi의 대답 에 대해 자세히 설명 하면 반복하려는 요소를 대기열에 넣고 대기열에 요소가있는 동안 요소를 제거 할 수 있습니다. 이렇게하면 원래 요소 외에 새 요소에 대한 "반복"이 허용됩니다.
어떻게 작동하는지 살펴 보겠습니다.
개념적으로 큐에 다음 요소가있는 경우 :
[1, 2, 3, 4]
그리고을 제거 할 때 1
를 추가하기로 결정 42
하면 대기열은 다음과 같습니다.
[2, 3, 4, 42]
큐가 FIFO ( 선입 선출 ) 데이터 구조이므로이 순서는 일반적입니다. ( Queue
인터페이스 에 대한 문서에서 언급했듯이 , 이것은 반드시 필요한 것은 아닙니다.Queue
. . PriorityQueue
요소를 자연스러운 순서로 정렬하는 경우 FIFO가 아닙니다.)
다음은 사용 예이다 LinkedList
(a 인 Queue
dequeing 동안 첨가 추가 요소와 함께 모든 요소를 통과하기 위해). 위의 예와 유사하게 42
요소 2
가 제거 되면 요소 가 추가 됩니다.
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
while (!queue.isEmpty()) {
Integer i = queue.remove();
if (i == 2)
queue.add(42);
System.out.println(i);
}
결과는 다음과 같습니다.
1
2
3
4
42
희망대로 42
맞았을 때 추가 된 요소 가 2
나타났습니다.