import java.util.ArrayList;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;

public class DemoPercorsiCollezioni {
    enum Stato { DISPONIBILE, PRESTATO, RIENTRATO }

    public static void main(String[] args) {
        List<String> titoli = new ArrayList<>(List.of("Java", "Reti", "Java"));
        ListIterator<String> cursore = titoli.listIterator(titoli.size());
        StringJoiner indietro = new StringJoiner(" | ");
        while (cursore.hasPrevious()) {
            indietro.add(cursore.previous());
        }
        System.out.println("Lista a ritroso: " + indietro);

        Set<String> catalogo = new LinkedHashSet<>(List.of("Java", "Reti"));
        Set<String> mostra = new LinkedHashSet<>(List.of("Reti", "API"));
        Set<String> unione = new LinkedHashSet<>(catalogo);
        unione.addAll(mostra);
        Set<String> comuni = new LinkedHashSet<>(catalogo);
        comuni.retainAll(mostra);
        System.out.println("Unione: " + unione);
        System.out.println("Comuni: " + comuni);

        EnumSet<Stato> statiVisibili = EnumSet.of(
                Stato.DISPONIBILE, Stato.PRESTATO);
        EnumMap<Stato, Integer> conteggi = new EnumMap<>(Stato.class);
        conteggi.put(Stato.PRESTATO, 2);
        conteggi.put(Stato.DISPONIBILE, 5);
        System.out.println("Stati: " + statiVisibili);
        System.out.println("Conteggi: " + conteggi);

        Iterator<String> iteratore = titoli.iterator();
        iteratore.next();
        StringJoiner restanti = new StringJoiner(" | ");
        iteratore.forEachRemaining(restanti::add);
        System.out.println("Restanti: " + restanti);

        Map<String, String> libri = new LinkedHashMap<>();
        libri.put("J-01", "Java");
        libri.put("R-02", "Reti");
        libri.put("R-02", "Reti, seconda edizione");
        libri.forEach((codice, titolo) ->
                System.out.println(codice + " -> " + titolo));
    }
}
