如何声明一个保存其引用值的ListIterator ?



我正在使用包含displayNextPhoto方法的类Album的实例变量从主类调用displayNextPhoto。每当我从主程序调用这个方法时,我都会得到一个并发修改异常。我怎样才能解决这个问题?我知道每当我调用这个函数时,listtiterator变量将被初始化,并且我将始终显示第一张照片,是否有一种方法可以使listtiterator在我调用这个方法时保持其值,以便我可以避免重新初始化该迭代器

public void displayNextPhoto(){
ListIterator<Photo> listIterator = photos.listIterator();
if(listIterator.hasNext()){
Photo photo = listIterator.next();
System.out.println("Displaying "+photo.getName()+" on "+photo.getDate());
goingForward = true;
}
else{
System.out.println("End of album");
}
}
}

listtiterator()也有一个重载版本,接受指定起始索引的int型输入。

如果你想从索引2开始,你可以这样声明:

ListIterator<Photo> listIterator = photos.listIterator(2);

您需要跟踪您的索引位置在您的对象之一,也许在相册对象,然后添加它作为一个参数的displayNextPhoto()

public void displayNextPhoto(int i){
ListIterator<Photo> listIterator = photos.listIterator(i);
if(listIterator.hasNext()){
Photo photo = listIterator.next();
System.out.println("Displaying "+photo.getName()+" on "+photo.getDate());
goingForward = true;
}
else{
System.out.println("End of album");
}
}

话虽这么说,如果你要修改一个类来包含一个存储迭代器当前索引的字段,你也可以只使用普通的ArrayList,而不用ListIterator。

这个怎么样?

List<Photo> photos;
ListIterator<Photo> listIterator;
public Construct() {
photos = new ArrayList<>();// init it.
listIterator = photos.listIterator();
}
public void displayNextPhoto() {
if (listIterator.hasNext()) {
Photo photo = listIterator.next();
// do something
} else {
System.out.println("End of album");
}
}

最新更新