1.3.34随机背包。随机背包能够存储一组元素并支持表1.3.10中的API:
表1.3.10泛型随机背包的API
public class RandomBag<Item> implements Iterable<Item>
RandomBag()//创建一个空随机背包
boolean isEmpty()//背包是否为空
int size()//背包中的元素数量
void add(Item item)//添加一个元素
编写一个RandomBag类来实现这份API。请注意,除了形容词随机之外,这份API和Bag的API是相同的,这意味着迭代应该随机访问背包中的所有元素(对于每次迭代,所有的N!种排列出现的可能性均相同)。提示:用数组保存所有元素并在迭代器构造函数中随机打乱它们的顺序。
答:
import java.util.Iterator;
public class RandomBag<Item> implements Iterable<Item>
{
private Item[] a=(Item[]) new Object[1];
private int N=0;
public RandomBag()
{
}
public boolean isEmpty()
{
return N==0;
}
public int size()
{
return N;
}
public void add(Item item)
{
if(N==a.length) resize(2*N);
a[N]=item;
N++;
}
private void resize(int max)
{
Item[] temp=(Item[]) new Object[max];
for(int i=0;i<N;i++)
temp[i]=a[i];
a=temp;
}
public Iterator<Item> iterator() {return new ListIterator();}
private class ListIterator implements Iterator<Item>
{
private int index;
public ListIterator()
{
for (int i = 0; i < N; i++)
{
int r = i + StdRandom.uniform(N-i); // between i and n-1
Item temp = a[i];
a[i] = a[r];
a[r] = temp;
}
}
public boolean hasNext(){return index!=N;}
public void remove(){}
public Item next()
{
Item item=a[index];
index++;
return item;
}//end next
}//end class ListIterator
public static void main(String[] args)
{
RandomBag<String> rBag=new RandomBag<String>();
while(!StdIn.isEmpty())
{
String item=StdIn.readString();
rBag.add(item);
}
for(String i:rBag)
StdOut.print(i+" ");
}
}