Java中的加权中位数

时间:2018-12-01 14:49:43

标签: java algorithm average

我正在尝试编写一个程序来计算加权中位数,但是我有一个小问题无法解决。 要找到加权中位数,您必须将每个权重除以总和,然后将其与0.5进行比较,如果更大则意味着找到的加权中位数,然后返回相应的x值。 这里是一个例子:

x = [3,4,6,10]
w = [1,2,3,5]
1/11 > 1/2 ? no
1/11+ 2/11 > 1/2 ? no
1/11+ 2/11 + 3/11 > 1/2 ? yes

然后返回6,因为它对应于3

这是我的尝试:

    public static void main(String[] args) {
    int[] x = new int[] {3,4,6,10};
    int[] w = new int[] {1,2,3,5};
    int sum = Arrays.stream(w).sum();//11

    if ((w[0]/sum)>0.5){
        System.out.print("The weighted meadin is " + x[0]);
    }
    else if ((w[0]/sum)+(w[1]/sum)>0.5){
        System.out.print("The weighted meadin is " + x[1]);
    }
    else if ((w[0]/sum)+(w[1]/sum)+(w[2]/sum)>0.5){
        System.out.print("The weighted meadin is " + x[2]);
    }
    else if ((w[0]/sum)+(w[1]/sum)+(w[2]/sum)+(w[3]/sum)>0.5){
        System.out.print("The weighted meadin is " + x[3]);
    }
    else{
        System.out.print("The weighted meadin not found");
    }
}

这总是返回last else语句。

2 个答案:

答案 0 :(得分:1)

sum数组和int变量中的元素都是/,因此,当执行0操作时,实际上是在执行{{3} }-也就是说,您仅保留除法的“整个”部分,在这种情况下,该部分始终为double

将其中一个操作数定义为double sum = Arrays.stream(w).sum(); 将使Java使用浮点除法并解决您的问题。例如:

openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf -ign_eof

答案 1 :(得分:0)

您使用的每个除法运算都是整数除法,因为两个操作数都是整数。

尝试使其成为浮点除法。 一种方法是例如将每个w[0] / sum等重写为w[0] * 1.0 / sum。 另一个方法是将sum变量声明为double