如何从二维数组创建临时列表来计算中位数?

时间:2017-10-27 12:34:52

标签: java windows coding-style

我需要创建一个ArrayMethods类。有了 •public static double median(double [] [] a) 方法。我知道我需要创建一个包含2d数组中所有值的列表。然后将其排序并找到中位数。 BUt我不知道如何创建列表。谁能帮我这个。 对于中位数,我已经这样做但它不适用于负数或奇数数组: -

public static void main(String[] args) {
    double[][] a = {
            {1,2,3},
            {4,5,6},
    };
    System.out.println(median(a));
}


   public static double median(double[][] a2) {
        double[] list = new double[a2.length*a2[0].length];
        double listPos = 0;

        for(double i = 0 ; i < a2.length; i++) {
            for(double j = 0; j < a2[(int) i].length; j++) {
                list[(int) listPos++] = a2[(int) i][(int) j];
             Arrays.sort(a2[(int) i]);
            }
        }
        double middle = list.length/2;
        if ((list.length%2) == 1) {
            return list[(int) middle];
        }
        return (list[(int) (middle-1)] + list[(int) middle]) / 2.0;
   }

}

1 个答案:

答案 0 :(得分:0)

如果我们只是在谈论创建一个列表,那么我们需要一个能够存储任意数量值的动态列表,因为如果我们要么对它进行硬编码(从不!),我们只知道数组的大小。在运行时。对此最好的解决方案是基本的ArrayList。

首先,我们将所有值存储到ArrayList中,一旦存储了所有值,我们就可以对其进行排序。如你所知,从那里开始下山。现在可以使用以下命令找到中位数(使用您的中位数实现):

public static double median(double[][] a2) {
    // check for an empty array
    if(a2.length == 0)
        throw new IllegalStateException("The array is empty");

    ArrayList<Double> list = new ArrayList<Double>();

    // first, add all the elements into the linear list
    for(int i = 0; i < a2.length; i++) {
        for(int j = 0; j < a2[0].length; j++) {
            list.add(a2[i][j]);
        }
    }

    // second, sort them
    Collections.sort(list);

    // and finally, determine the median based on the number of items
    int length = list.size();

    // if there is an even number of values, take the average of the 2 middle values
    if(length % 2 == 0)
        return (list.get(length/2 - 1) + list.get(length/2)) / 2.0;

    // else, return the middle value
    return list.get(length / 2);
}

我还在检查一个空数组,但如果你想摆脱它,你可以。希望这有帮助!