查找arrayList中位数的问题

Posted

技术标签:

【中文标题】查找arrayList中位数的问题【英文标题】:Problems finding median of arrayList 【发布时间】:2017-04-28 07:46:31 【问题描述】:

我不断收到The type of the expression must be an array type but it resolved to ArrayList<Double> arrayList 正在从我的测试类中提取数字。我做了 if 来确定 arrayList 中的值是偶数还是奇数,因为我可以使用两种不同的方法来确定中位数。但我无法让中位数公式起作用。

public class Data 

private ArrayList<Double> sets;

public Data(double[] set) 
    this.sets = new ArrayList<Double>();
    for (double i : set) 
        this.sets.add(i);
    


public double getMedian()
    Collections.sort(sets);

    double middle = sets.size()/2;
        if (sets.size()%2 == 1) 
           middle = (sets[sets.size()/2] + sets[sets.size()/2 - 1])/2;
         else 
            middle = sets[sets.size() / 2];
        
      return middle;

【问题讨论】:

sets 是一个ArrayList 不是一个数组,你不能使用像sets[index] 这样的索引符号,它是用于常规数组的。请改用sets.get(index) 简短回答,ArrayList 不是数组。它是一个使用数组的对象,因此您需要使用方法来设置/获取其中的值。 【参考方案1】:

问题出在你找到中间的那一行:

middle = (sets[sets.size()/2] + sets[sets.size()/2 - 1])/2;

您只能对数组使用 [index] 表示法。您需要使用 getter/setter 方法来访问 ArrayList 的元素。这应该有效:

middle = (sets.get(sets.size()/2) + sets.get(sets.size()/2 - 1))/2;

【讨论】:

因为这条线是下划线(使用 IDE)或用javac 显示给 OP。您应该解释为什么需要在ArrayList 中使用.get(index)。他的问题没有真正的解释。【参考方案2】:

您使用的是arrayList 而不是数组,因此必须使用ArrayList 的get(int index) 方法来访问数据。这是这样使用的:

middle = (sets.get(sets.size()/2) +sets.get((sets.size()/2)-1) )/2;

【讨论】:

你能不能试着重新表述你的句子,这并不意味着什么;)请解释为什么它不能像数组一样使用。 好的,tnx 提醒一下【参考方案3】:

问题在于,如果您有一个包含 4 个元素 [0..3] 的数组,要找到中位数,您只需执行 4/2 - 1 = 1 并且索引 1 是数组的中位数。现在如果数组是 5,你只需做 5/2 = 2 并且 2 是中位数。

public double getMedian() 
    Collections.sort(sets);
    int middle = sets.size() / 2;
    middle = middle > 0 && middle % 2 == 0 ? middle - 1 : middle;
    return sets.get(middle);

【讨论】:

因为如果您有一个包含 4 个元素 [0..3] 的数组,要找到中位数,您只需执行 4/2 - 1 = 1 并且索引 1 是数组的中位数。现在如果数组是 5,你只需做 5/2 = 2 并且 2 是中位数。我可以改变中间--来干预- 1 更多阅读【参考方案4】:

确保在 if 语句中检查它是否等于 0。

public double getMedian()
    Collections.sort(sets);

    double middle = sets.size()/2;
        if (sets.size()%2 == 0) 
           middle = (sets.get(sets.size()/2) + sets.get(sets.size()/2 - 1))/2;
         else 
            middle = sets[sets.size() / 2];
        
      return middle;

【讨论】:

以上是关于查找arrayList中位数的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中查找列表的中位数

算法第2章上级实践报告

有/无重复二分查找,矩阵查找,有序数组中位数,接雨水算法

第1章第1节练习题10 查找中位数

在二叉搜索树中查找中位数的错误

在 Spark SQL 中查找多个双数据类型列的中位数