背包的定义:
背包是一种不支持从中删除元素的集合数据类型--它的目的就是帮助用列收集元素并迭代遍历所有收集到的元素(用列也可以检查背包是否为空或者获取背包中元素的数量)。迭代的顺序不确定且与用例无关。
背包的java代码的实现:
package com.learn.bag;
import java.util.Arrays;
import java.util.Iterator;
public class Bag<E> implements Iterable<E> {
private Object[] table; //背包容器内部的数据结构,是一个对象的数组。便于接受任意类型(向上转型)
private static final int DEFAULT_SIZE = 16;//默认容器大小
private int size;//元素个数
public Bag(){
table=new Object[DEFAULT_SIZE];
}
//添加元素
public void add(E item) {
ensureCapacity();//在新增之前进行容器
table[size++] = item;
}
//容器扩容 参考ArrayList源码的实现
private void ensureCapacity() {
if (size >= table.length) {
int leg = table.length;
int newCapacity=leg + (leg >> 1);//注意要加括号leg+(leg>>1)曾因为没有加括号,数据扩容后,没有起到任何效果,导致数组越界问题。
table = Arrays.copyOf(table, newCapacity);
}
}
//判断元素是否为空
public boolean isEmpty() {
return size == 0;
}
//获取元素的数量
public int size() {
return size;
}
public E get(int i) {
assert i < 0 || i >= size;
return (E)table[i];
}
//因为要实现迭代功能,在java中必须要实现Iterable接口,实现iterator()方法,返回一个可迭代的元素(实现了Iterator接口,hasNext() 方法和next()方法,java语法糖知识)
@Override
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
private int cursor; //cursor 进行迭代 上下指针移动
@Override
public boolean hasNext() {
return cursor != size();
}
@Override
public E next() {
int i = cursor;
cursor++;
return get(i);
}
}
}