背包的定义:

         背包是一种不支持从中删除元素的集合数据类型--它的目的就是帮助用列收集元素并迭代遍历所有收集到的元素(用列也可以检查背包是否为空或者获取背包中元素的数量)。迭代的顺序不确定且与用例无关。

      背包的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);
}

}

}

   

posted on 2018-07-03 09:25  蔡苗  阅读(339)  评论(0编辑  收藏  举报