gpt4 book ai didi

java - 如何在Java中使用Iterator/Iterable?

转载 作者:行者123 更新时间:2023-12-02 05:26:13 25 4
gpt4 key购买 nike

我想在我的 Prison 类中创建一个 iterator() 方法,但要做到这一点,我想创建一个包含 boolean 的新类将实现某个接口(interface)的迭代器的 hasNext()PrisonCell next() 方法。

package iterator;
import java.util.Iterator;
public class Driver {

public static void main(String args[]) {
Prison prison= new Prison(5);
Iterator<PrisonCell> iter;

prison.addCell(new PrisonCell("A", 3));
prison.addCell(new PrisonCell("B", 9));
prison.addCell(new PrisonCell("C", 6));

iter= prison.iterator(); //I want to make the iterator() method in my Prison class

while (iter.hasNext())
System.out.println(iter.next());
}
/**output here would be:
Name: A, numPrisoners: 3
Name: B, numPrisoners: 9
Name: C, numPrisoners: 6
**/

}



package iterator;
public class PrisonCell { //how would I implement the Iterable<> iterface here?

private String name;
private int numPrisoners;

public PrisonCell(String name, int numPrisoners) {
this.name= name;
this.numPrisoners= numPrisoners;
}

public String toString() {
return "Name: " + name + ", numPrisoners: " + numPrisoners;
}

}



package iterator;
public class Prison{

PrisonCell prisonCells[];
int numPrisonCells;

public Prison(int size) {
prisonCells= new PrisonCell[size];
numPrisoners= 0;
}

// just do nothing if the array is full
public void addCell(PrisonCell newPrisonCell) {
if (numPrisonCells < prisonCells.length)
prisonCells[numPrisonCells++]= newPrisonCell;
}

//how do I write iterator() method here??
}

package iterator;
public class Iterator<PrisonCell>//is it supposed to implement an interface here?
//which fields here?
public Iterator() //constructor here
//I think boolean hasNext() and PrisonCell next() methods go here?

最佳答案

Iterable接口(interface)通常由某种类型的集合实现。在您的情况下,它是 Prison 类,而不是可以声明为实现 PrisonCellIterable<PrisonCell>* 它需要实现一个方法: iterator() ,它将返回 Iterator<PrisonCell>

返回什么对象?一种简单的方法是将数组简单地包装在 List 中,并要求 List 返回 Iterator :

public class Prison implements Iterable<PrisonCell> {
PrisonCell prisonCells[];

. . .

public Iterator<PrisonCell> iterator() {
return Arrays.asList(prisonCells).iterator();
}
}

(您可以考虑将 prisonCellsPrisonCell[] 更改为 List<PrisonCell> ;这是我推荐的。然后您可以直接要求它返回 Iterator 。)

或者,编写您自己的类来实现 Iterator 接口(interface)方法。 (这通常由集合类的私有(private)内部类完成,因为迭代器通常访问集合的内部数据结构——不应该在公共(public) API 中公开的东西。)它可能应该抛出 remove() 方法的异常,因为对象数组支持的集合通常不支持该操作。 (由 Iterator 构造的 List 返回的 Arrays.asList() 的行为就是这样。)

这是对这样一个内部类的快速尝试。我编写它的假设是 numPrisonCells 数组中只有前 prisonCells 个元素有效:

public class Prison implements Iterable<PrisonCell> {

PrisonCell prisonCells[];
int numPrisonCells;

. . .

public Iterator<PrisonCell> iterator() {
return new PrisonIterator();
}

private class PrisonIterator implements Iterator<PrisonCell> {
private int index;

PrisonIterator() {
index = -1;
}

public boolean hasNext() {
return index < numPrisonCells - 1;
}

public PrisonCell next() {
if (index < numPrisonCells - 1) {
return prisonCells[++index];
} else {
throw new NoSuchElementException();
}
}

public void remove() {
// you could actually implement something here
throw new UnsupportedOperationException();
}
}
}

请注意,这不是一个非常健壮的迭代器实现;特别是,如果 prisonCells 数组在迭代过程中被修改,它可能会跳过或重复元素。 Java 集合框架通过让每个集合对象维护一个内部 long 修改计数来解决这个问题,并且在构造每个迭代器时,它会初始化自己的修改计数副本。然后,在对迭代器的每个方法调用中,它都会检查集合的 mod 计数是否与其内部副本匹配,如果不匹配,则抛出 ConcurrentModificationException

*当然,您可能想让 PrisonCell 实现 Iterable<Prisoner> 。 :)

关于java - 如何在Java中使用Iterator/Iterable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25986835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com