【问题标题】:Get median from array [closed]从数组中获取中位数[关闭]
【发布时间】:2014-10-07 20:31:44
【问题描述】:

我正在尝试从我的数组中获取中值长度。我正在使用以下代码,但出现错误。我不知道为什么会出现这些错误。

int middleSlot = list.length/2;
    list[middleSlot];

【问题讨论】:

  • HashSet 是使用散列函数存储的,其非线性分配类似于数组。你不能通过你正在做的事情来实现你想要的。
  • 是设置列表还是数组???
  • @Alboz 根据问题,我相信它是一个 HashSet。
  • @wrongAnswer 我知道,但出于一些奇怪的原因,他称其为“列表”..
  • 大家好。我正在上课,而 HashSet 属于 SET。我将我的 HashSet 称为“列表”,对于任何混淆,我深表歉意。

标签: java arrays median


【解决方案1】:

Apache Commons Math 会做到这一点。

http://commons.apache.org/proper/commons-math/userguide/stat.html#a1.3_Frequency_distributions

或者: Mean, Median, Mode, Range - Java

用法为:double answer = getMean(list);

getMean()

public double getMean(double[] numberList) {
    double total;
    for (double d: numberList) {
        total += d;
    }
    return total / (numberList.length);
}

getMedian()

This method is going on the assumption that the passed array is already sorted (i.e. {1,2,3,...}).

public double getMedian(double[] numberList) {
    int factor = numberList.length - 1;
    double[] first = new double[(double) factor / 2];
    double[] last = new double[first.length];
    double[] middleNumbers = new double[1];
    for (int i = 0; i < first.length; i++) {
        first[i] = numbersList[i];
    }
    for (int i = numberList.length; i > last.length; i--) {
        last[i] = numbersList[i];
    }
    for (int i = 0; i <= numberList.length; i++) {
        if (numberList[i] != first[i] || numberList[i] != last[i]) middleNumbers[i] = numberList[i];
    }
    if (numberList.length % 2 == 0) {
        double total = middleNumbers[0] + middleNumbers[1];
        return total / 2;
    } else {
        return middleNumbers[0];
    }
}

getMode()

public double getMode(double[] numberList) {
    HashMap<Double,Double> freqs = new HashMap<Double,Double>();
    for (double d: numberList) {
        Double freq = freqs.get(d);
        freqs.put(d, (freq == null ? 1 : freq + 1));   
    }
    double mode = 0;
    double maxFreq = 0;    
    for (Map.Entry<Double,Doubler> entry : freqs.entrySet()) {     
        double freq = entry.getValue();
        if (freq > maxFreq) {
            maxFreq = freq;
            mode = entry.getKey();
        }
    }    
    return mode;
}

getRange()

public double getRange(double[] numberList) {
    double initMin = numberList[0];
    double initMax = numberList[0];
    for (int i = 1; i <= numberList.length; i++) {
        if (numberList[i] < initMin) initMin = numberList[i];
        if (numberList[i] > initMax) initMax = numberList[i];
    }
    return initMax - initMin;
}     

【讨论】:

  • 为中位数法;如果数组是散列集怎么办?它会忽略它并仍然运行该方法吗?
  • 如何从 main 调用这个方法?例如,如果我调用一个返回 void 的方法,我会使用“myMethod();”你会如何调用这个方法来运行?也许像:“getMedian(double,list);” ??
  • > 用法为:double answer = getMean(list);
【解决方案2】:

要获得中间的元素,您可能需要执行类似

的操作
int middleSlot = list.size()/2;
int counter =0 ;
TypeOfList middleElement=null;
for(TypeOfList eachElement: list.values) {
   if(counter == middleSlot) {
       middleElement= eachElement; break;
   }
   counter++;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2013-03-15
    • 2022-10-24
    • 2019-08-15
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多