我正在实施此立面以包装linkedlist,treetet和Hashset类,in Java。
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)`
我已经遵循了其他问题的写作方式,但我的循环似乎仍然引发了例外。
您的 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);
}