【问题标题】:Weighted median in javajava中的加权中位数
【发布时间】:2018-12-01 14:49:43
【问题描述】:

我正在尝试编写一个程序来计算加权中位数,但我遇到了一个无法解决的小问题。 要找到加权中位数,您必须将每个权重除以总和,然后将其与 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");
    }
}

这总是返回最后一个 else 语句。

【问题讨论】:

  • 您在 w[0]/sum 等中使用整数除法,它始终为零。切换到浮动或双,开始。
  • 谢谢!!我知道这是一个愚蠢的错误:(

标签: java algorithm average


【解决方案1】:

w 数组和sum 变量中的元素都是ints,所以在执行/ 操作时,实际上是在执行integer division - 即,您只保留除法的“整体”部分,在这种情况下始终为0

将其中一个操作数定义为double 将使Java 使用浮点除法,从而解决您的问题。例如:

double sum = Arrays.stream(w).sum();

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多