標籤:介面 add 數組 檢查 判斷 return 定義 資料 類型
背包的定義:
背包是一種不支援從中刪除元素的集合資料類型--它的目的就是協助用列收集元素并迭代遍曆所有收集到的元素(用列也可以檢查背包是否為空白或者擷取背包中元素的數量)。迭代的順序不確定且與用例無關。
背包的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);
}
}
}
java-背包的實現