2015-09-21 2 views
2

Что я делаю неправильно?Как сделать медиану в java

Медиана всегда -0,5 результат или 0,5, если ((m) + (m+1))/2;

public static double mediana(List<Double> liczby){ 
    Collections.sort(liczby); 
    int n = liczby.size()/2; 
    double m; 
    m = get(n); 
    if (liczby.size() % 2 == 0){ 

     return ((m) + (m-1))/2; 

    } 
    else { 
     return m; 
    } 
} 
+0

Что такое ваш вклад? –

+1

Каков размер переменной 'liczby' в ваших тестах? Какой метод 'get (n)' делает? –

+0

- размер номеров (liczby), определенных пользовательским приложением. проблема будет в методе get (n) – elle

ответ

1

Вы должны быть извлекая n и n-1 -х элементов. Вы в настоящее время вычитание 1 из п-го значения, которое не имеет смысла:

return (get(n) + get(n-1))/2; 
1

Я считаю, что проблема с этим является линией return ((m) + (m-1))/2; Вы забываете, чтобы получить вход следующего элемента в списке. Попробуйте:

l = get(n+1); 
return (m + l)/2; 

вместо:

return ((m) + (m-1))/2; 
3

В вашем коде, проблема в этой строке.

return ((m) + (m-1))/2; 

Она должна возвращать среднее значение п го числа и (N-1) я числа как N = (размер списка)/2. Вы можете попробовать это.

public static double mediana(List<Double> liczby){ 
Collections.sort(liczby); 
int n = liczby.size()/2; 
double m; 
if (liczby.size() % 2 == 0) 
m = (liczby.get(n) + liczby.get(n-1))/2; 
else 
m = liczby.get(n); 
return m; 
} 
0

Не знаю, как искать способ get(n). Он автоматически генерируется. Метод не может вернуться к нулю.

private static double get(int n) { 
    // TODO Auto-generated method stub 
    return 0; 
} 
1

Вчера я столкнулся с такой же проблемой, и я написал решение, подобное типу sifho. Мой метод --- реализованный с использованием Java generics --- вычисляет среднее значение для каждой коллекции чисел. Вы можете использовать метод с наборами Doubles, Integer, Floats и возвращает double. Учтите, что мой метод создает другую коллекцию, чтобы не изменять исходную. Я также предоставляю тест, получаю удовольствие. ;-)

public static <T extends Number & Comparable<T>> double median(Collection<T> numbers){ 
    if(numbers.isEmpty()){ 
     throw new IllegalArgumentException("Cannot compute median on empty array of numbers"); 
    } 
    List<T> numbersList = new ArrayList<>(numbers); 
    Collections.sort(numbersList); 
    int middle = numbersList.size()/2; 
    if(numbersList.size() % 2 == 0){ 
     return 0.5 * (numbersList.get(middle).doubleValue() + numbersList.get(middle-1).doubleValue()); 
    } else { 
     return numbersList.get(middle).doubleValue(); 
    } 

} 

JUnit тест фрагмент кода:

/** 
* Test of median method, of class Utils. 
*/ 
@Test 
public void testMedian() { 
    System.out.println("median"); 
    Double expResult = 3.0; 
    Double result = Utils.median(Arrays.asList(3.0,2.0,1.0,9.0,13.0)); 
    assertEquals(expResult, result); 
    expResult = 3.5; 
    result = Utils.median(Arrays.asList(3.0,2.0,1.0,9.0,4.0,13.0)); 
    assertEquals(expResult, result); 
} 

Пример использования (рассмотрим имя класса Utils):

List<Integer> intValues = ... //omitted init 
Set<Float> floatValues = ... //omitted init 
..... 
double intListMedian = Utils.median(intValues); 
double floatSetMedian = Utils.median(floatValues); 
Смежные вопросы