Esercitazione 4: Data la classe Persona dell’esercitazione 2, definire un ordinamento naturale in base all’età (confrontare le date di nascita, sfruttando il compareTo() della classe java.util.Date). Per la classe Persona definire anche due ordinamenti aggiuntivi, mediante due nested inner classes di tipo Comparator. Il primo ordinamento è LexicographicalOrder che ordina le persone in base al cognome e, a parità di cognome, in base al nome. Il secondo ordinamento aggiuntivo è ShortestFullNameOrder che ordina le persone in base al numero complessivo di caratteri del cognome e del nome (è “minore” la persona che ha un numero minore complessivo di caratteri tra nome e cognome). La classe Studente eredita gli ordinamenti definiti per la classe Persona e in aggiunta introduce un ordinamento mediante un Comparator chiamato theYoungerTheBetter che ordina gli studenti in base all’età e a parità d’età li ordina in base al numero di matricola. Testare gli ordinamenti creando una lista di Persona e una lista di Studenti (usando le liste delle API di Java) ed effettuare gli ordinamenti utilizzando il metodo Collections.sort(List<T> list, Comparator<? super T> c). Dopo aver ridefinito il tipo base di MyLinkedList (e analogamente di MyArrayList) in Persona oppure in Studente, definire un metodo nella classe MyLinkedList (e analogamente in MyArrayList) chiamato sort che implementa l’ordinamento naturale della lista (richiamando il compareTo() degli oggetti di cui la lista è composta). Ad esempio: MyList lista = new MyLinkedList(); lista.add(new Persona("Maria", "De Zen", "31/02/1970")); lista.add(new Persona("Piero", "Angela", "23/02/1935")); //altri add… lista.sort();//ordina la lista in base all’ordinamento naturale – la lista di partenza è ordinata Definire un metodo nella classe MyLinkedList (e analogamente in MyArrayList) chiamato sort(Comparator<T> c) che accetta in input un oggetto di tipo Comparator<Persona> che permette di usare gli ordinamenti aggiuntivi LexicographicalOrder e ShortestFullNameOrder. Ad esempio: lista.sort(new Persona.LexicographicalOrder()); //ordina la lista usando l’ordinamento lessicografico Nota: per implementare l’algoritmo di ordinamento utilizzare uno degli algoritmi di ordinamento visti negli anni presedenti (ad esempio: insertion sort, bubble sort, etc.). Ad esempio, nei seguenti link si trovano esempi di utilizzo di compareTo() e di Comparator per implementare algoritmi di ordinamento: https://www.daniweb.com/programming/software-development/threads/347069/insertionsort-method-using-comparable-array http://www.cs.uofs.edu/~mccloske/courses/cmps144/java_comparator_sorting.html