import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.StdOut;
import java.util.Iterator;
public class RandomBag<Item> implements Iterable<Item> {
public static void main(String[]args){
RandomBag<String> Bag=new RandomBag<>();
for (int i=0;i<8;i++)
Bag.add("A"+i);
for (String s:Bag)
StdOut.print(s+" ");
StdOut.println();
for (String s:Bag)
StdOut.print(s+" ");
StdOut.println();
}
private Node first;
private Node last;
private int N;
private class Node{
Item item;
Node next;
}
public RandomBag(){
first=null;
last=null;
N=0;
}
public boolean isEmpty(){return first==null;}
public int size(){return N;}
public void add(Item item){
Node newlast=new Node();
newlast.item=item;
if (first==null){
first=newlast;
last=first;
}else {
last.next=newlast;
last=newlast;
}
N++;
}
public Iterator<Item> iterator(){
return new RandomBagList();
}
private class RandomBagList implements Iterator<Item>{
private Item[] arr=(Item[])new Object[size()];
private int index;
public RandomBagList(){
int i=0;
for (Node current=first;current!=null;current=current.next,i++)
arr[i]=current.item;
StdRandom.shuffle(arr);
index=0;
}
public boolean hasNext(){
return index!=size();
}
public Item next(){
return arr[index++];
}
}
}