正如标题所述,我需要找到数组的模式。但是,对此有一些规定:
1)如果不存在模式(即每个元素只出现一次或相等),则返回{1,2,2,3,4,5,5,6}
2)如果存在多个模式(即Double.NaN
将提供两种模式,2和5)返回Double.NaN
基本上,它应该只返回数组的元素,如果它绝对是数组的模式,并且至少比所有其他元素出现一次。任何其他时间,它应该返回NaN
我当前的代码返回一个模式。但是,如果两个数字相同,则将两者中的后一个作为模式返回,而不是NaN
。此外,如果不存在模式,则不会返回public double mode(){
double[] holder = new double[data.length];
double tempMax = 0, permMax = 0, location = 0, arrayMode = 0;
for (int i = 0; i < data.length; ++i) {
int count = 0;
for (int j = 0; j < data.length; ++j) {
if (data[j] == data[i])
++count;
}
holder[i] = count;
}
for (int w = 0; w < holder.length; w++){
if (holder[w] > tempMax){
tempMax = holder[w];
arrayMode = data[w];
}
}
permMax = arrayMode;
return permMax;
}
。
感谢任何帮助。
这是我到目前为止所做的:
{{1}}
答案 0 :(得分:0)
最好的方法是对数组进行排序,然后从头到尾完成计算每个数字的实例数量与目前为止的最大数量。如果您确实需要保留数字的原始顺序,请先复制数组
public static double mode (double[] data) {
double maxnum = Double.NaN;
double num = 0;
int maxcount = 0;
int count = 0;
double[] used = Arrays.copyOf(data, data.length);
Arrays.sort(data);
for (int i = 0; i < used.length; i++) {
if (used[i] == num) {
count++;
}
else {
num = used[i];
count = 1;
}
if (count == maxCount) {
maxnum = Double.NaN;
}
if (count > maxCount) {
maxnum = num;
maxcount = count;
}
}
return maxnum;
}
答案 1 :(得分:0)
很容易找到此问题的副本,例如here。
话虽如此,我想补充一点:
public double findMode(int[] inArray) {
List<Integer> il = IntStream.of(inArray).boxed().collect(Collectors.toList());
int maxFreq = 0;
double value = 0;
for (Integer i : ia){
if (Collections.frequency(il, i) > maxFreq && i != value){
maxFreq = Collections.frequency(il, i);
value = i;
} else if (Collections.frequency(il, i) == maxFreq && i != value) {
value = Double.NaN;
}
}
return value;
}
它将int[]
转换为List<Integer>
并使用Collections.frequency
方法获取每个值的出现次数。
免责声明:我可能会错过一些优化措施。