如何查找数组的模式(如果存在)。如果有多个模式,则返回NaN

时间:2017-04-14 13:33:27

标签: java arrays

正如标题所述,我需要找到数组的模式。但是,对此有一些规定:

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

2 个答案:

答案 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方法获取每个值的出现次数。

免责声明:我可能会错过一些优化措施。