【问题标题】:Calculating the Mode计算模式
【发布时间】:2020-07-23 07:10:56
【问题描述】:

我正在尝试编写一个方法来计算一组数据的模式并返回它。如果没有模式或多个模式(例如:如果 4 & 2 返回的次数最多)我,希望函数返回 Double.NaN。我能够获得该模式,但如果有多个模式,我无法让我的代码返回 Double NaN。

这是我的代码!

public double mode() {

    if (data == null) {
        double mode;
        mode = Double.NaN;
        return mode; // returns no value if array is null
    }

    double mode = 0;
    double modeCounter = 0;

    for (int c = 0; c < data.length; ++c) {
        int count = 0;
        for (int i = 0; i < data.length; ++i) {
            if (data[i] == data[i])
                ++count;
        }
        if (count > modeCounter) {
            modeCounter = count;
            mode = data[c];
        }
    }
    if (!(modeCounter > 1)) {
        return Double.NaN;
    }

    return mode;

}

【问题讨论】:

  • 什么是数据?一个数组?
  • 什么时候没有模式?对于像 [1,2,3] 这样的数组,模式是什么?
  • if (data[i] == data[i]) - 总是这样

标签: java arrays methods return mode


【解决方案1】:

我假设您使用的是 Java。

我们可以通过简单地创建一个 Map 来找到模式(以及您设置的返回 Double.NaN 的限制),其中键是单个数据点,值是它们在数据数组中的对应计数。

Streams 对编写可读且简洁的代码非常有用。

如果您对数组/ArrayList 中的每个成员都有计数,则可以简单地使用此计数根据您的要求得出结论。

请看下面实现上述解释的代码:

public static Double mode(List<Double> data) {
    if (data.isEmpty()) {
        // returning NaN if the input arraylist is empty 
        return Double.NaN;
    }

    Map<Double, Integer> count = new HashMap<>();
    data.forEach(
            i -> {
                count.putIfAbsent(i, 1);
                count.put(i, count.get(i) + 1);
            }
    );
    int maxCount = count.values().stream().max(Integer::compare).get(); // this assumes that the data is not empty
    if (count.values().stream().filter(i -> i == maxCount).count() > 1) {
        // more than one mode present
        return Double.NaN;
    }

    // here we'll be sure that only one mode exists
    return count
            .entrySet()
            .stream()
            .filter(e -> e.getValue() == maxCount)
            .findFirst() // as we've only one mode
            .get()
            .getKey();
}

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 2013-08-13
    • 1970-01-01
    • 2011-12-31
    • 2016-01-02
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多