2015-04-29 40 views
10

Potrzebowałem metody, aby uzyskać medianę 3 wartości, myślałem, że to dobra okazja, aby napisać ogólną metodę, ponieważ tak naprawdę jej nie stosowałem. Napisałem to i wydaje mi się to całkiem proste, chociaż otrzymałem ostrzeżenie, ale wydaje mi się, że działa dobrze, zgodnie z moimi testami.Ogólna metoda znajdowania median 3 wartości

Jestem świadomy, że mógłbym użyć nieodłącznie posortowanego zestawu lub Collections.sort(), ale to podejście jest ze względu na zrozumienie.

Chcę wskazać kilka rzeczy:

  1. zauważyłem to nie działa, gdy starałem się zadeklarować medianHelper z Arrays.asList(a, b, c) dlaczego to ma być? Próba przeszukiwania tego daje mi niepowiązane wyniki, a poza tym jest nieuchwytna, ponieważ nie jestem pewien, co się dzieje. Dostaję UnsupportedOperationException, ale to nie jest obecne tak, jak mam to poniżej.
  2. Dlaczego otrzymuję ostrzeżenie? Co jest nie tak/brakuje?

Sposób następująco:

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

Jakie ostrzeżenie otrzymujesz? – benzonico

Odpowiedz

12

Nie prawidłowo wprowadził typu parametru T, jak Comparable jest nazwą rodzajową, too.

Powinno być raczej:

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

Ponadto, można po prostu rodzaj wykaz medianHelper, ponieważ jego elementy będzie być Comparable. Więc twój sposób można znacznie skrócić do:

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); 
} 

pamiętać, że Arrays.asList() zwraca niezmienne lista, co oznacza, że ​​nie wolno dodawać/usuwać elementy po jej utworzeniu. Jeśli chcesz wykonać porównania samodzielnie, możesz użyć new ArrayList<> zamiast Arrays.asList(), a następnie ręcznie dodać elementy do niego.

+2

To powinno być nawet 'T przedłuża Porównywalne ' – fge

+0

Rzeczywiście. Właśnie miałem zastosować tę zmianę. Dzięki. –

+0

Dziękuję, Kocko. Całkowicie przeoczyłem, że "porównywalne" ma charakter ogólny, i dziękuję, fge za ważne rozróżnienie, że ma również górną granicę. Nadal jestem zakłopotany tematem błędów Arrays.asList, jeśli chcę sam przeprowadzić porównania. jakieś pomysły? – Legato