RandomBag.java
import java.util.Iterator;
import edu.princeton.cs.algs4.StdRandom;
public class RandomBag<Item> implements Iterable<Item>{
private Item[] item;
private int N;
@SuppressWarnings("unchecked")
public RandomBag(int cap)
{
if (cap <= 0)
throw new RuntimeException();
item = (Item[])(new Object[cap]);
}
public boolean isEmpty()
{
return N == 0;
}
public boolean isFull()
{
return N == item.length;
}
public void resize(int n)
{
@SuppressWarnings("unchecked")
Item[] temp = (Item[])(new Object[n]);
for (int i = 0; i < N; ++i)
temp[i] = item[i];
item = temp;
}
public int size()
{
return N;
}
public void add(Item data)
{
if (isFull())
resize(2 * N);
item[N++] = data;
}
public Iterator<Item> iterator()
{
return new RandomBagIterator();
}
private class RandomBagIterator implements Iterator<Item>
{
private int current = 0;
public RandomBagIterator()
{
// i ----- N - 1
for (int i = 0; i < N; ++i)
{
int r = i + StdRandom.uniform(N - i);
Item temp = (Item) item[i];
item[i] = item[r];
item[r] = temp;
}
}
public boolean hasNext()
{
return current != N;
}
public void remove()
{
}
public Item next()
{
return (Item) item[current++];
}
}
}
测试:main.java
import edu.princeton.cs.algs4.StdOut;
public class Main {
public static void main(String[] args)
{
RandomBag<Integer> rb = new RandomBag<Integer>(6);
for (int i = 0; i < 10; ++i)
rb.add(i);
for (Integer t : rb)
StdOut.print(t + " ");
}
}