【问题标题】:How to find mode of an array, if one exists. If more than one mode, return NaN [duplicate]如何查找数组的模式(如果存在)。如果有多个模式,则返回 NaN [重复]
【发布时间】:2017-09-10 18:40:31
【问题描述】:

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

1) 如果不存在模式(即每个元素只出现一次或相等的次数)返回Double.NaN

2) 如果存在多个模式(即{1,2,2,3,4,5,5,6} 将给出两种模式,2 和 5)返回 Double.NaN

基本上,如果它肯定是数组的模式,它应该只返回数组的元素,并且比所有其他元素至少出现一次。任何其他时间,它应该返回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;
}

【问题讨论】:

  • 几乎没有理由不将 mode 设为带有 double[] 参数的静态方法

标签: java arrays


【解决方案1】:

很容易找到这个问题的重复项,例如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&lt;Integer&gt; 并使用Collections.frequency 方法获取每个值的出现次数。

免责声明:我可能错过了一些优化。

【讨论】:

  • 您是否建议我按照链接代码中的说明进行操作,但将 count=0 更改为 count =1?或者将您在此处列出的内容实施到我现有的方法中?
  • 我修改了您链接的代码中的最后一个 if-else 分支以返回 Double.NaN 而不是选择两者中的较低者。感谢大家的帮助!
【解决方案2】:

最好的方法是对数组进行排序,然后从头到尾计算每个数字的实例数与迄今为止找到的最大值。如果确实需要保持数字的原始顺序,请先复制数组

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

【讨论】:

  • 所以你说排序,找到每个元素的频率,然后将频率与之前的最大频率进行比较。如果大于之前,则变为最大值。如果等于,返回NaN,如果小于,max保持不变?
  • @slowdawg84 基本上是的
猜你喜欢
  • 2021-07-27
  • 2016-09-26
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多