Algs4-1.3.34随机背包

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+" ");
    }
}

原文地址:https://www.cnblogs.com/longjin2018/p/9854312.html