2017-05-04 13 views
0

LinkedList, TreeSet 및 HashSet 클래스를 java로 랩핑하기 위해이 Facade를 구현하고 있습니다. 포함 된 기능에 외관 구현의 ConcurrentModificationException

import java.util.Iterator; 

public class CollectionFacadeSet implements SimpleSet{ 
protected java.util.Collection<java.lang.String> collection; 
private Iterator<java.lang.String> iterator; 
private int count; 
/** 
* Creates a new facade wrapping the specified collection. 
* @param collection - The Collection to wrap. 
*/ 
public CollectionFacadeSet(java.util.Collection<java.lang.String> collection){ 

    this.collection=collection; 
    iterator = this.collection.iterator(); 
    count=0; 
} 
/** 
* Add a specified element to the set if it's not already in it. 
* @param newValue New value to add to the set 
* @return False iff newValue already exists in the set 
*/ 
public boolean add(java.lang.String newValue){ 
    if(contains(newValue)) 
     return false; 
    collection.add(newValue); 
    return true; 
} 
/** 
* Look for a specified value in the set. 
* @param searchVal Value to search for 
* @return True iff searchVal is found in the set 
*/ 
public boolean contains(java.lang.String searchVal){ 
    while(iterator.hasNext()) 
    { 
     java.lang.String myString=iterator.next(); //issue 
     System.out.println(myString); 
     if(myString.equals(searchVal)) 
      return true; 
    } 
    return false; 
} 

, 나는 다음 (현재) 개체를 호스트하기 위해 문자열을 만드는거야 한 번, 내가받을 다음과 같은 오류 :

Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966) 
    at java.util.LinkedList$ListItr.next(LinkedList.java:888)` 

나는 다음 한 꽤 많은 방법의를 다른 질문에 작성하지만 내 루프가 여전히 예외를 throw 나타납니다.

+0

당신이 이름을 완전히 자격을하는 이유는 무엇입니까? 'java.lang.String'은 필요하지 않습니다. 그냥'String'을 사용하십시오. 'java.util.Collection;을 임포트 할 필요가 있지만'java.util.Collection' 대신'Collection'을 쓸 수 있습니다. –

+0

이것이 우리 대학 직원이 원하는 방식입니다. 또한 3 일 전까지 반복자가없는 컬렉션을 반복하도록 요청했습니다. \ – tamir

답변

2

add 메서드는 반복기를 만든 후에 컬렉션을 수정합니다.

멤버 변수의 반복자를 갖는의 contains 방법 내부를 선언하는 대신 :

public boolean contains(java.lang.String searchVal){ 
    Iterator<String> iterator = collection.iterator(); 
    while(iterator.hasNext()) { 
    // ... 

현재 코드에 다른 문제가 contains 방법은 반복자를 배출한다는 것이다 - 당신이 겪었 일단 한 번만 요소가 포함되어 있지 않은 것으로 확인되면 다시 설정되지 않으므로 contains 메서드는 다음에 요소를 찾지 못합니다. 이것을 로컬 변수로 선언하면이 문제도 해결됩니다.


은 물론, 당신은 정말 당신이 요소를 인쇄하고 있다는 사실이 아닌, 전혀 Iterator 필요가 없습니다. (필자는 디버깅을 위해이 작업을 수행하고있는 것 같지만 실제로 유용하지는 않습니다.)

당신은 단순히 Collection.contains 사용할 수 있습니다

public boolean contains(String searchVal) { 
    return collection.contains(searchVal); 
} 
+0

정말 고마워요! – tamir