【问题标题】:Wrong Median Answer错误的中位数答案
【发布时间】:2019-02-22 03:32:51
【问题描述】:

问题:我在计算 arrayList 的中值时遇到问题

背景:所以我的 ArrayList 得到随机生成的值,我必须计算它的中值;我相信我的中值公式很好,但我得到了 ArrayList 中 3 个值的错误中值答案。

对于类似三个值,它给出了错误的中位数。例如: 当数组列表具有值时: 193.5、200.5、239.8 那么程序只是取前两个值的平均值并给出答案,而不是 200.5

public double getMedianB(){
    Collections.sort(myDataB);
    double middle = myDataB.size()/2;
    if (myDataB.size()%2 == 1) {
       middle = (myDataB.get(myDataB.size()/2) + myDataB.get(myDataB.size()/2 - 1))/2;
    } else {
        middle = myDataB.get(myDataB.size() / 2);
    }
    System.out.println("median:" + middle);
  return middle;
}

【问题讨论】:

  • 这段代码是否应该可重复用于任何数量的值?无论哪种方式,在我看来,代码完全按照您编写的代码执行。
  • 注意索引从零开始。
  • AFAIK 不应该反过来吗?我的意思是if (myDataB.size() % 2 == 0) {do average of middle values}?因为在奇数情况下,您的中位数是完美的中间值,而当您有偶数个值时,您需要在中间的两者之间找到一个值。

标签: java arraylist median


【解决方案1】:

为了获取中间值,您只需要获取中间值。而在您的示例中,您正在计算前两个值的平均值。

将代码更改为:

Collections.sort(myDataB);
        double middle = myDataB.size()/2;
        if (myDataB.size()%2 == 1) {
           middle = (double)myDataB.get(myDataB.size()/2);
        } else {
            middle = (double) myDataB.get(myDataB.size() / 2);
        }
        System.out.println("median:" + middle);

改变 else 条件,无论你想在那里执行什么。

【讨论】:

    【解决方案2】:

    中位数的计算公式

    1. 按升序排列列表
    2. 如果列表中的项目数为奇数,则中间数为中位数
    3. 如果项目数是偶数,则将中间两个数相加除以二,这个结果就是中位数

    在您的代码中,您有偶数和奇数切换的条件,因此正确的条件如下

    if (myDataB.size()%2 == 0) {
       middle = (myDataB.get(myDataB.size()/2) + myDataB.get(myDataB.size()/2 + 1))/2;
    } else {
        middle = myDataB.get(myDataB.size() / 2);
    }
    

    【讨论】:

      【解决方案3】:

      你应该翻转你的条件:

      以下条件检查词条数是否为奇数。在这种情况下,您只需要一个中间值。

      if (myDataB.size()%2 == 1) {
      

      【讨论】:

        猜你喜欢
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多