2015-04-29 17 views
10

Avevo bisogno di un metodo per ottenere la mediana di 3 valori, ho pensato che fosse una buona occasione per scrivere un metodo generico in quanto non ho davvero praticato. Ho scritto questo e sembra piuttosto semplice, anche se ricevo un avvertimento, ma sembra funzionare bene, secondo i miei test.Metodo generico per trovare la mediana di 3 valori

Sono consapevole che potrei utilizzare un set ordinatamente ordinato, o Collections.sort(), ma questo approccio è per motivi di comprensione.

voglio individuare un paio di cose:

  1. Ho notato che questo non funziona se ho cercato di dichiarare medianHelper con Arrays.asList(a, b, c) perché è questo? Cercando di cercare questo mi dà risultati non correlati ed è altrimenti inafferrabile dal momento che non sono sicuro di ciò che sta accadendo. Ottengo un UnsupportedOperationException, ma questo non è presente nel modo in cui lo ho qui sotto.
  2. Perché ricevo un avviso? Cosa c'è di sbagliato/mancante?

Il metodo segue:

private static <T extends Comparable> T median(T a, T b, T c) { 
    List<T> medianHelper = new ArrayList<>(); 
    T max; 
    T min; 

    medianHelper.add(a); 
    medianHelper.add(b); 
    medianHelper.add(c); 

    if (a.compareTo(b) >= 0) { 
     max = a; 
     min = b; 
    } else { 
     max = b; 
     min = a; 
    } 

    if (max.compareTo(c) == -1) { 
     max = c; 
    } 

    if (min.compareTo(c) >= 0) { 
     min = c; 
    } 

    medianHelper.remove(max); 
    medianHelper.remove(min); 

    return medianHelper.get(0); 
} 
+0

Che avviso ricevi? – benzonico

risposta

12

Non hanno introdotto correttamente il tipo di parametri T, come Comparable è generico, troppo.

Dovrebbe invece essere:

private static <T extends Comparable<? super T>> T median(T a, T b, T c) 

Inoltre, si può solo sorta lista medianHelper, dal momento che i suoi elementi sarà essere Comparable. Così il vostro metodo può essere significativamente ridotto a:

private static <T extends Comparable<? super T>> T median(T a, T b, T c) { 
    List<T> medianHelper = Arrays.asList(a, b, c); 

    Collections.sort(medianHelper); 

    return medianHelper.get(1); 
} 

notare che Arrays.asList() restituisce una lista non modificabile, che significa che non è permesso di aggiungere/rimuovere gli elementi dopo che è stato creato. Se si desidera effettuare da soli il confronto, è possibile utilizzare new ArrayList<> anziché Arrays.asList() e aggiungere manualmente gli elementi.

+2

Che dovrebbe essere anche 'T estende confronta ' – fge

+0

Infatti. Stavo per applicare la modifica. Grazie. –

+0

Grazie, kocko. Ho completamente trascurato che 'Comparable' è generico, e grazie, fge per l'importante distinzione che ha anche un limite superiore. Sono ancora perplesso sull'argomento degli errori Arrays.asList se voglio fare il confronto da solo. qualche idea? – Legato