2015-10-18 6 views
1

Ну, я программирую арифметический калькулятор с помощью Java, и я попытался реализовать функцию, которая вычисляет режим. Проблема в том, что по какой-то причине она работает неправильно. Вот функция:Статистический режим (калькулятор Java)

public static String moda(Double[] valores){ 

    Double resultado = null; 
    Integer contador = 0; 
    Integer contadorFinal = 0; 

    for(int i = 0; i < valores.length; i++){ 

     contador = 0; 
     for(int j = 0; j < valores.length; j++){ 

      if(valores[i] == valores[j]) contador++; 
     } 

     if(contador > contadorFinal){ 
      resultado = valores[i]; 
      contadorFinal = contador; 
     } 
    } 

    return "La moda es " + resultado + " que se repite un total de " + contadorFinal + " veces."; 
} 

По какой-то причине, он всегда возвращался мне первое значение массива (например, если Double [] Valores содержит (4,7,7,8,8,8) он будет верните мне 4); и режим всегда равен 1.

Я искал код снова и снова, и для меня это выглядит хорошо. Не могли бы вы мне помочь?

+0

Ну, у вас есть только одна переменная «count». Как в вашем примере (4,7,7,8,8,8) он мог знать, что 7 произошло два раза, а 8 - три? Вам нужна одна переменная count за значение в массиве. – markspace

+0

@markspace благодарим вас за ответ! «contadorFinal» - это второй счетчик. – xFunkyTImes

+0

Да, извините. Но сначала я не мог понять, что вы делаете. Ваш алгоритм не будет хорошо сфокусироваться на больших наборах данных, вы можете посмотреть, как это сделать в одном цикле (что и предполагал мой комментарий). – markspace

ответ

4

Это потому, что вы сравниваете Double, a класс, путем равенства. Используйте double или используйте Double.compare().

for(int i = 0; i < valores.length; i++){ 

    contador = 0; 
    for(int j = 0; j < valores.length; j++){ 

     if(Double.compare(valores[i], valores[j]) == 0) 
      contador++; 
    } 

    if(contador > contadorFinal){ 
     resultado = valores[i]; 
     contadorFinal = contador; 
    } 
} 
+0

Спасибо @markspace! Ты мой спаситель, я как часами смотрю этот код :) – xFunkyTImes

+0

Фантастический ответ, и отличный вопрос. Я тоже сбился с толку за последние 15 минут! – Siddhartha

+1

Интересно отметить, что исходный код работал бы, если бы '' 'Integer'' использовался вместо' '' Double''' из-за целых чисел кэширования java от '' '-128 и 127''' , – Siddhartha

Смежные вопросы