1.3.36随机迭代器。为上一题中的RandomQueue<Item>编写一个迭代器,随机返回队列中的所有元素。
答:
import java.util.Iterator;
public class RandomQueue<Item> implements Iterable<Item>
{
private int N=0;
private Item[] a=(Item[]) new Object[1];
public RandomQueue()
{
}
public boolean isEmpty()
{return N==0;}
public void enqueue(Item item)
{
if(N==a.length) resize(2*N);
a[N]=item;
N++;
}
public Item dequeue()
{
int r=StdRandom.uniform(N);
Item item=a[r];
a[r]=a[N-1];
N--;
if(N==a.length/4) resize(2*N);
return item;
}
public Item sample()
{
int r=StdRandom.uniform(N);
return a[r];
}
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=0;
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)
{
RandomQueue<Card> cards=new RandomQueue<Card>();
for(int value=1;value<=13;value++)
for(int type=1;type<=4;type++)
{
Card c=new Card();
c.value=value;
c.type=type;
cards.enqueue(c);
}//end for
while(!cards.isEmpty())
{
Card c=cards.dequeue();
StdOut.print("("+c.value+"," +c.type+")");
}//end while
}//end main
}//end class