背包
背包是不支持从中删除元素的集合数据类型。
存在的目的是帮助调用者收集元素,并遍历之。
接口设计
// 向背包中添加元素
public void add(Item element);
// 返回背包有效大小
public int size();
// return 迭代器
public Iterator<Item> iterator();
分析与要求
1 支持泛型
2 动态大小
3 支持迭代(Foreach)
实现
public class Bag<Item> implements Iterable<Item> { //实现此接口,对象可迭代,使用foreach等
private Item[] data;//存放数据的数组
private int idx = 0;//记录有效元素界限的指针
/** @param initSize 背包的初始大小 */
public Bag(int initSize) {
data = (Item[]) new Object[initSize];//初始化数组
}
/** 返回迭代器 */
public Iterator<Item> iterator() {
return new Iterator<Item>() {
private int index = 0;//迭代进度标记
public boolean hasNext() { return index < idx; }
public Item next() { return index < idx ? data[index++] : null; }
public void remove() { }
};
}
/** 向背包中添加元素 */
public void add(Item element) {
if (idx == data.length) resize(data.length * 2);
data[idx++] = element;
}
/** 扩展数组大小(新建一个更大的数组,并将元素迁移过去) */
private void resize(int newSize) {
Item[] temp = (Item[]) new Object[newSize];
for (int i = 0; i < data.length; i++) {
temp[i] = data[i];
}
data = temp;
}
/** @return 返回背包有效大小 */
public int size() { return idx; }
}