import java.util.Iterator;
import java.util.NoSuchElementException;
public class MyList implements Iterable<Integer> {
private int[] data;
private int size;
public MyList() {
data = new int[16];
size = 0;
}
public void add(int num) {
if (size == data.length) {
resize();
}
data[size++] = num;
}
private void resize() {
int[] newData = new int[data.length * 2];
System.arraycopy(data, 0, newData, 0, size);
data = newData;
}
@Override
public Iterator<Integer> iterator() {
return new MyListIterator();
}
private class MyListIterator implements Iterator<Integer> {
private int current = 0;
private boolean canRemove = false;
@Override
public boolean hasNext() {
return current < size;
}
@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
canRemove = true;
return data[current++];
}
@Override
public void remove() {
if (!canRemove) {
throw new IllegalStateException();
}
canRemove = false;
System.arraycopy(data, current, data, current - 1, size - current);
size--;
current--;
}
}
}
关键实现步骤解释
- 数据存储:
- 使用一个
int
类型的数组data
来存储整数数据。
size
变量记录当前集合中实际存储的元素个数。
- 构造函数初始化数组大小为16,当元素个数达到数组大小时,通过
resize
方法将数组大小翻倍。
- 迭代器实现:
MyList
类实现了Iterable<Integer>
接口,并重写iterator
方法,返回一个MyListIterator
实例。
MyListIterator
类实现了Iterator<Integer>
接口,包含hasNext
、next
和remove
方法。
hasNext
方法检查是否还有下一个元素,即current
是否小于size
。
next
方法返回当前位置的元素,并将current
指针后移一位。同时设置canRemove
为true
,表示可以进行删除操作。
remove
方法删除当前迭代器指向的元素。在删除前先检查canRemove
,若为false
则抛出IllegalStateException
。删除元素后,通过System.arraycopy
方法将后续元素向前移动一位,并更新size
和current
。这样保证了迭代过程中的增删操作与迭代器的一致性。