统计模式(计算器Java)

统计模式(计算器Java),java,calculator,mode,Java,Calculator,Mode,我正在用Java编程一个算术计算器,我试图实现一个计算模式的函数。问题是出于某种原因,它不能正常工作。下面是函数: public static String moda(Double[] valores){ Double resultado = null; Integer contador = 0; Integer contadorFinal = 0; for(int i = 0; i < valores.length; i++){ co

我正在用Java编程一个算术计算器,我试图实现一个计算模式的函数。问题是出于某种原因,它不能正常工作。下面是函数:

public static String moda(Double[] valores){

    Double resultado = null;
    Integer contador = 0;
    Integer contadorFinal = 0;

    for(int i = 0; i < valores.length; i++){

        contador = 0;
        for(int j = 0; j < valores.length; j++){

            if(valores[i] == valores[j]) contador++;
        }

        if(contador > contadorFinal){
            resultado = valores[i];
            contadorFinal = contador;
        }
    }

    return "La moda es " + resultado + " que se repite un total de " + contadorFinal + " veces.";
}
公共静态字符串moda(双[]值){
Double resultado=null;
整数contador=0;
整数=0;
for(int i=0;icontadorFinal){
resultado=valores[i];
contadorFinal=contador;
}
}
返回“La moda es”+resultado+“que se repite un total de”+contadorFinal+“veces.”;
}
出于某种原因,它总是返回数组的第一个值(例如,如果Double[]valores包含(4,7,7,8,8,8),它将返回我4);模式也总是1


我已经一次又一次地查看代码,对我来说它看起来很好。你能帮帮我吗?

这是因为你在平等地比较
Double
,一个类。使用
double
或使用
double.compare()

for(int i=0;icontadorFinal){
resultado=valores[i];
contadorFinal=contador;
}
}

这是因为你用相等的方法来比较一个
类的
。使用
double
或使用
double.compare()

for(int i=0;icontadorFinal){
resultado=valores[i];
contadorFinal=contador;
}
}

嗯,您只有一个“count”变量。在你的例子(4,7,7,8,8,8)中,它如何知道7发生了两次,8发生了三次?数组中每个值需要一个计数变量。@markspace谢谢您的回答!“contadorFinal”是第二个柜台。是的,很抱歉。但一开始我不知道你在做什么。您的算法在大型数据集上执行得不好,您可能会在一个循环中研究如何执行此操作(这是我的评论所假设的)。一个问题是,您当前没有实际计算数组中只出现一次的值,因为您在递增
contador
之前进行了相等性检查。因此,例如,如果数组中只有一个35的实例,则相等性检查将永远不会计算为
true
,并且35将不会被计算在内。只有当数组中的所有值只出现一次,但仍然可以修复时,才会出现问题!我同意@markspace,如果你想把这段代码提升到一个新的层次,重写它,让它在O(n)而不是O(n^2)中运行。在你的例子(4,7,7,8,8,8)中,它如何知道7发生了两次,8发生了三次?数组中每个值需要一个计数变量。@markspace谢谢您的回答!“contadorFinal”是第二个柜台。是的,很抱歉。但一开始我不知道你在做什么。您的算法在大型数据集上执行得不好,您可能会在一个循环中研究如何执行此操作(这是我的评论所假设的)。一个问题是,您当前没有实际计算数组中只出现一次的值,因为您在递增
contador
之前进行了相等性检查。因此,例如,如果数组中只有一个35的实例,则相等性检查将永远不会计算为
true
,并且35将不会被计算在内。只有当数组中的所有值只出现一次,但仍然可以修复时,才会出现问题!我同意@markspace,如果你想把这段代码提升到一个新的层次,就重写它,让它在O(n)而不是O(n^2)中运行。谢谢@markspace!你们是我的救世主,我已经花了好几个小时在寻找这个密码:)奇妙的答案,以及极好的问题。在过去的15分钟里,我也被这件事弄糊涂了!需要注意的一件有趣的事情是,如果使用
Integer
而不是
Double
,原始代码本来可以工作,因为java缓存了
-128和127
中的整数。谢谢@markspace!你们是我的救世主,我已经花了好几个小时在寻找这个密码:)奇妙的答案,以及极好的问题。在过去的15分钟里,我也被这件事弄糊涂了!需要注意的一件有趣的事情是,如果使用
Integer
而不是
Double
,原始代码本来可以工作,因为java缓存了
-128和127
中的整数。
for(int i = 0; i < valores.length; i++){

    contador = 0;
    for(int j = 0; j < valores.length; j++){

        if( Double.compare( valores[i], valores[j] ) == 0 ) 
           contador++;
    }

    if(contador > contadorFinal){
        resultado = valores[i];
        contadorFinal = contador;
    }
}