import java.util.*;
public class RemoveFromColectionWithIteratorOK {
    private List<Ficha> mesa;
    private List<Ficha> mano;
    public static final int MAX_NUM = 2;
    public RemoveFromColectionWithIteratorOK() {
        mano = new LinkedList<Ficha>();
        mesa = new LinkedList<Ficha>();
        for (int a = 0; a <= MAX_NUM; a++) {
            for (int b = a; b <= MAX_NUM; b++) {
                if (a == MAX_NUM && b == MAX_NUM) {
                    mesa.add(new Ficha(MAX_NUM, MAX_NUM));
                } else {
                    mano.add(new Ficha(a, b));
                }
            }
        }
    }
    public void tiraFichas() {
        boolean bloqueado = false;
        while (!mano.isEmpty() && !bloqueado) {
            bloqueado = true;
            Iterator<Ficha> it = mano.iterator();
            while(it.hasNext()) {
                Ficha f = it.next();
                boolean tirada = true;
                if (f.getB() == mesa.get(0).getA()) {
                    mesa.add(0, f);
                } else if (f.getA() == mesa.get(0).getA()) {
                    mesa.add(0, f.girarFicha());
                } else if (f.getA() == mesa.get(mesa.size() - 1).getB()) {
                    mesa.add(f);
                } else if (f.getB() == mesa.get(mesa.size() - 1).getB()) {
                    mesa.add(f.girarFicha());
                } else {
                    tirada = false;
                }
                if (tirada) {
                    it.remove(); // remove sobre el iterador
                    // ya no da java.util.ConcurrentModificationException
                    System.out.println(this);
                    bloqueado = false;
                }
            }
        }
    }
    public void vaciaPila() {
        mano.clear();
        System.out.println(this);
    }
    @Override
    public String toString() {
        String s = "";
        s += "mano(" + mano.size() + "): ";
        // El Iterator no se crea, se pide.
        Iterator<Ficha> it = mano.iterator();
        while(it.hasNext()) {
            s += it.next();
        }
        s += "\n";
        s += "mesa(" + mesa.size() + "): ";
        Iterator it2 = mesa.iterator();
        while(it2.hasNext()) {
            s += it2.next();
        }
        /*
        for (Ficha f : mesa) {
            s += f;
        }
        */
        return s;
    }
    public static void main(String[] args) {
        RemoveFromColectionWithIteratorOK d = new RemoveFromColectionWithIteratorOK();
        System.out.println(d);
        d.tiraFichas();
    }
}
