Search code examples
javaarraysmedian

Get median from array


I am trying to get the median length from my array. I am using the following code but I get errors. I do not know why I get these errors.

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

Solution

  • Apache Commons Math will do it.

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

    OR: Mean, Median, Mode, Range - Java

    USAGE would be: 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;
    }