당신은, 예를 들어 ConcurrentModifcationException을 유발하지 않는 중 하나
- Set를 사용해야 ConcurrentXxxSet
- 집합을 변경하기 전에 복사본을 가져옵니다.
간단한 변화는 제네릭
for (Object o: set.toArray()) {
if (condition(o))
set.add(something);
}
이 간단한 해결책이
Set<T> set =
for(T t: new HashSet<T>(set)) {
// something which might add to set
}
참고 될 수있다 :이 방금 추가 한 요소의 반복을 방지 할 수 있습니다. 주 2 : 동시 세트를 사용하면 추가 된 요소가 표시되거나 가능하지 않을 수 있습니다.
요소를 추가 할 때 요소를 실제로 볼 필요가있는 경우 목록을 사용하거나 대신 해당 요소를 사용해야합니다.
List<T> list = new ArrayList<>(set);
for(int i = 0; i < list.size(); i++) {
T t = list.get(i);
if (condition)
// if it is not a duplicate
if (set.add(something))
list.add(something);
}
이렇게하면 신뢰할 수있는 방식으로 루프에 추가 한 요소를 볼 수 있습니다. 참고 : 무한 루프를 만들지 않고 메모리를 모두 사용하지 않도록주의를 기울여야합니다.
대신 목록 대신 대기열을 사용하는 방법도 있습니다. 이것은 더 좋을 수도 있지만 덜 효율적이라고 생각합니다.
Queue<T> q = new ConcurrentLinkedQueue<>(set);
for(T t : q) {
if (condition)
// if it is not a duplicate
if (set.add(something))
q.add(something);
}
@RuchiraGayanRanaweera : 반복자는 값의 제거 *를 허용하지만 * 추가 *는 허용하지 않습니다. –
"작동하지 않는 각 루프에 대해 새로운 것을 만들 수 없다"는 것은 무엇을 의미합니까? 정확히 작동하지 않는 것은 무엇이며 어떤 방식으로 작동하지 않을까요? 나는 보통 "나중에 추가 할 것들"의 모음을 만들고 나중에 추가 할 것입니다. –
내 말은 정확히 동일한 세트를 사용하고 지속적으로 업데이트해야한다는 것입니다. 그러나 나는 그것을하는 방법을 알아낼 것 같지 않은가? –