LinkedList에서 중복을 제거하는 매우 간단한 방법을 쓰려고합니다 :이터레이터에서 remove()를 호출하면 ConcurrentModificationException이 발생하는 이유는 무엇입니까?
추가 버퍼를 사용하지 않고이 작업을 시도하므로 링크 된 목록에 두 개의 반복자를 유지합니다. 하나는 일반 반복을 유지하고 다른 하나는 유지합니다. (CareerCup에 표시된대로) 모든 이전 노드를 반복하여 중복을 확인합니다. 다음과 같이
public static void RemoveWithoutBuffer(LinkedList l) {
ListIterator itr1 = l.listIterator();
int count1 = 0;
int count2 = 0;
while (itr1.hasNext()) {
Object next = itr1.next();
count1++;
count2 = 0;
ListIterator itr2 = l.listIterator();
while (itr2.hasNext()) {
count2++;
if (count2 == count1)
break;
if (itr2.next() == next){
itr1.remove();
}
}
}
}
HashSet의의 도움으로이 문제의 또 다른 간단한 해결책은 간단하고도 예외는보고되지 : 그러나, 컴파일러가 내게 말하길가 심지어 내가) (itr1.remove를 호출하고 비록 CME입니다
public static void Remove(LinkedList l) {
HashSet set = new HashSet();
ListIterator itr = l.listIterator();
while (itr.hasNext()) {
Object next = itr.next();
if (set.contains(next))
itr.remove();
else
set.add(next);
}
}
itr2를 반복 할 때 itr1을 수정할 수 없기 때문에 그렇습니까? 이 문제를 해결할 수있는 방법이 있습니까? 고마워.
감사합니다. 솔루션은 훌륭하지만 여전히 여유 공간을 소비합니다. hashSet을 사용할 때보 다 더 많은 공간을 절약 할 수 있습니다. 링크 주셔서 감사합니다. – Superziyi
공백이 있으면 요소를 삭제 된 것으로 표시 할 수 있습니다 (예 : 목록의 경우 null로 설정하거나 세트의 경우 isRemoved 속성이있는 특수 키를 사용하고 나중에 실제 제거를 수행 할 수 있음). –