package jcf_map.exercise;

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;

public class Dispari<E extends Comparable<? super E>> {
	
	/*
	 * Esercizio 1 - Esame del 5 settembre 2017
	 * 
	 * Una lista si dice dispari se ciascuno dei suoi oggetti appare un numero dispari di volte.
	 * Ad esempio, la lista di interi [20, 5, 5, 20, 20] non è dispari, mentre lo è [5, 20, 5 , 5].
	 * Si assuma una classe Dispari<E> con una sola variabile di instanza private LinkedList<E> myList.
	 * Si implementi un metodo public boolean ordinaDispari() {} interno alla classe, 
	 * che restituisce false se myLisy non è dispari, mentre ordina in modo crescente la lista 
	 * e restituisce true se myList è dispari;
	 * Si assuma che gli elementi presenti nella lista implementino l'interfaccia Comparable<T>
	 */
	
	// Variabile di instanza
	private LinkedList<E> myList = new LinkedList<E>();
	
	// Metodo di esercizio
	public boolean isDispari() {
		// Se la lista è vuota allora returna dispari
		if (myList.isEmpty()) return true;
		
		// Contatore di elementi nella lista
		HashMap<E, Integer> valori = new HashMap<E, Integer>();
		
		Iterator<E> it = myList.iterator();
		while (it.hasNext()) {
			E current = it.next();
			if (valori.get(current) == null) valori.put(current, 1);
			else valori.put(current, valori.get(current) + 1);
		}
		
		// Controllo short circuit di disparità
		for (E chiave : valori.keySet()) {
			int valore = valori.get(chiave);
			if (valore % 2 == 0) return false;
		}
		
		// Arrivati qui la lista è dispari, manca solo l'ordinamento.
		Collections.sort(myList);
	}
}
