java - Java 查找数组的众数

标签 java arrays

我必须找到数组的众数。我有点不好意思承认我已经在这个问题上坚持了一天了。我想我有点想太多了——我的方法变得越来越长。我一直遇到的真正问题是,当没有 one 模式时(两个数字以相同的频率出现),我需要返回 Double.NaN。

这是我尝试过的:

private double[] data = {1, 1, 2, 2, 2, 3, 4, 5, 5, 5, 5, 5, 6, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9};

if(data.length != 0){

        double maxValue = -1;
        int maxCount = 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++;
                }
            }

            if(count > maxCount) {
                maxValue = (int) data[i];
                maxCount = count;
            }
        }
        return maxValue;

    }else{

        return Double.NaN;

    }

这实际上返回模式,但它不能处理两种模式。这是我最近的尝试,但只完成了一半:

private double[] data = {1, 1, 2, 2, 2, 3, 4, 5, 5, 5, 5, 5, 6, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9};

public void mode(){

    int[] frequency = new int[data.length];

    double[] vals = new double[data.length];

    for(int i = 0; i < data.length; i++){
        frequency[i] = occursNumberOfTimes(data[i]);
    }

    boolean uniform = false;

    for(int g = 0; g < frequency.length && !uniform; g++){
        if(frequency[0] != frequency[g]){
            uniform = false;
        }

    int[] arr = new int[frequency.length-1];

    for(int j = 1; j < frequency.length; j++){

        if(frequency[j] > frequency[j-1]){

            int mod = 0;

            for(int k = 0; k < arr.length; k++){
                if(k == j){
                    mod += 1;
                    arr[k] = frequency[k + mod];
                }else{
                    arr[k] = frequency[k + mod];    
                }
            }
        }
    }
    frequency = arr;
    }
}

private int occursNumberOfTimes(double value){

    int count = 0;

    for(int i = 0; i < data.length; i++){
        if(data[i] == value){
            count++;
        }
    }
    return count;
}

我在第二次尝试中有点迷失了,我只是不知道如何处理多种模式。我已经把我的想法写出来了,但我不知道如何写。 我无法使用 Arrays 类中的任何内容,这就是我迷失的原因。

最佳答案

一定要高效吗?如果没有:

double maxValue = -1.0d;
int maxCount = 0;
for (int i = 0; i < data.length; ++i) {
    double currentValue = data[i];
    int currentCount = 1;
    for (int j = i + 1; j < data.length; ++j) {
        if (Math.abs(data[j] - currentValue) < epsilon) {
            ++currentCount;
        } 
    }
    if (currentCount > maxCount) {
        maxCount = currentCount;
        maxValue = currentValue;
    } else if (currentCount == maxCount) {
        maxValue = Double.NaN;
    }
}
System.out.println("mode: " + maxValue);

关于java - Java 查找数组的众数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53271399/

相关文章:

java - HTML 输入按钮位于 div 中

arrays - 显示数据时出现整数数组错误

c++ - 递归部分解释

arrays - 在 Go 中克隆 float slice 而不影响原始

java - Spring ACL 使用 JPA,但 ACL 实现是 JDBC。两种方式

java - play框架scala获取连接表属性

java - 尝试访问 POJO 属性时为空指针

javax.faces.FacesException 。它是属于 Spring Security 3.x 的一个异常(exception)

arrays - powershell 返回 1 个单个元素而不是数组

将索引替换为加在一起的下 4 个索引的 Java 代码