Si definisca una classe generica MinMax che contiene due campi min, max del tipo generico. Poi scrivere un metodo generico che appartenente ad un'altra classe, che data in input una collezione, restituisce una elemento di tipo MinMax contenente il minimo e il massimo tra gli oggetti della collection fornita.
Questa è la mia soluzione.
=== CLASSE MINMAX ===
public class MinMax <T> {
private T min, max;
public MinMax(T min, T max){
this.min = min;
this.max = max;
}
public void print(){
System.out.println("min:"+min+" max:"+max);
}
}
=== METODO GETMINMAX (2 versioni) ===
public static <E extends Comparable<? super E>> MinMax<T> getMinMax1(List<E> l){
Optional<E> max = l.stream().max(Comparator.naturalOrder());
Optional<E> min = l.stream().min(Comparator.naturalOrder());
return (max!=null && min!=null) ? new MinMax(min,max) : null;
}
public static <E extends Comparable<? super E>> MinMax<T> getMinMax2(List<E> l){
l.sort(Comparator.naturalOrder());
E min = l.get(0);
E max = l.get(l.size()-1);
return new MinMax(min,max);
}
Nel I getMinMax ho utilizzato gli stream e il metodo max che necessariamente torna un tipo Optional, il che consente di prevenire l'eccezione nel caso in cui la lista sia vuota, controllando se il valore di ritorno è null. C'è da dire che la complessità di questo caso è O(n+n) dato che per due volte cerco prima il min e poi il max.
Nel II getMinMax, ordino dapprima la lista tramite l'ordinamento naturale degli elementi che implementeranno Comparable, poi estrapolo il primo elemento che sarà il min e l'ultimo il max. La complessità è solo O(n),leggermente più rapido ma comunque lineare come il precedente, ma non tiene conte dell'ArrayIndexOutOfBoundsException nel caso in cui la lista sia vuota.
Esiste un metodo migliore? Se utilizzassi un tipo che non implementa Comparable cosa succede?
Sono i miei primi approcci ai generici, oramai fondamentali in Java, ed accetto qualsiasi consiglio e delucidazione.
Saluti e buona giornata.
Update: o avrei dovuto direttamente nella definizione della classe, specificare che il tipo utilizzato deve essere ti tipo Comparable?
public class MinMax <T extends Comparable<? super T> {...}