Мне было поручено найти режим для данного массива (неопределенная длина). Режим определяется как число, которое встречается наиболее уникально . Так, например, режим массива [1.0, 2.0, 3.0, 2.0] равен 2.0. Однако, если нет уникального номера этого значения, например, [1.0, 2.0, 2.0, 3.0, 3.0], программа возвращает «no mode» или «Double.NaN» в моей программе.
Я написал код, который работает для 3/4 тестовых случаев, но всегда портит случай, когда есть два одинаковых режима.
public double mode() {
double modeOne = data[0];
double modeTwo = 0;
int count = 0;
int countOne = 0;
int countTwo = 0;
if(data.length == 1) { // special case: if array length is 1 the mode will always just be that value
modeOne = data[0];
return modeOne;
} // end if
for(int i = 0; i < data.length; i++) { // pulling out first value
double value = data[i];
for(int n = 0; n < data.length; n++) { // comparing first value to all other values
if (data[n] == value) {
count ++; // adding onto a count of how many of the same number there are
}
}
if(modeOne == value || modeTwo == value) { // move on if the modes already have that value
continue;
}
if(count > countOne) { // setting the max count
countTwo = countOne;
countOne = count;
modeTwo = modeOne;
modeOne = value;
}
else if(count > countTwo) { // setting second highest count
countTwo = count;
modeTwo = value;
}
} // end for
if(countOne == 1) { // if all the modes are just one
return Double.NaN;
}
if(countOne == countTwo) { // if there are two of the same modes
return Double.NaN;
}
else {
return modeOne;
}
} //end MODE
Для этого теста:
double[] data = {1,2,2,3,3,4};
Stat stat1 = new Stat(data);
System.out.println("stat1 mode = " + stat1.mode());
Я ожидаю "NaN", но он возвращает 4. Однако, это работает для случая ниже:
double[] data = {-5.3, 2.5, 88.9, 0, 0.0, 28, 16.5, 88.9, 109.5, -90, 88.9};
Stat stat1 = new Stat(data);
System.out.println("stat1 mode = " + stat1.mode());
Ожидаемый результат - 88,9, который программа выводит правильно.