我有一个数组,它存储用户输入的一系列双精度数。阵列的长度是用户的选择,因此会有所不同。我将数字放入一个循环中,该循环计算平均值并将异常值交换为数组的最后一个索引。计算没有离群值的新平均值,并将新离群值交换到数组的倒数第二个索引。重复此循环,直到剩余1个元素。

但是,离群值并未从数组中删除,因此我需要以某种方式计算平均值而没有离群值。我当时想我可以指定要包含在平均值中的元素的索引。

最佳答案

看来过程应该是这样的:


通过遍历数组直到n个元素来计算平均值。
查找异常值。
与最后一个元素交换。
现在将n设置为(数组的当前大小-1)。并继续执行直到大小= 0;


我已经编译了一个可能对您有用的代码。请记住,您可能需要根据需要进行一些小的更改。

  public static void main(String[] args) throws FileNotFoundException {
        double[] dataArray = new double[] {1.5,2.5,3.5,4.5,7.5,8.5,2.5};
        int arraySizeToConsider = dataArray.length;
        double outlier;
        int index_outlier;
        double avg;
        double diffInOutlierAndAvg;

        while(arraySizeToConsider > 0) {
            outlier = dataArray[0];
            index_outlier = 0;
            avg = computeSum(dataArray,arraySizeToConsider) / (arraySizeToConsider);//avg of elements
            diffInOutlierAndAvg = Math.abs(avg - outlier);

            // find outlier
            for(int index = 0; index<arraySizeToConsider; index++)//increments index
            {
                if(Math.abs(avg - dataArray[index]) > diffInOutlierAndAvg) {
                    outlier = dataArray[index];
                    index_outlier = index;
                }
            }
            double temp = dataArray[arraySizeToConsider -1];
            dataArray[arraySizeToConsider -1] = outlier;
            dataArray[index_outlier] = temp;
            arraySizeToConsider = arraySizeToConsider -1;
            System.out.println("Average: " + avg + " Outlier: " + outlier + " index " + index_outlier + " array size to consider: " +arraySizeToConsider);
        }
    }
    private static double computeSum(double[] array, int arraySizeToConsider) {
        double sum = 0;
        for (int i = 0; i < arraySizeToConsider; i++) {
            sum = sum + array[i];
        }
        return sum;
    }


这是输出:

Average: 4.357142857142857 Outlier: 8.5 index 5 array size to consider: 6Average: 3.6666666666666665 Outlier: 7.5 index 4 array size to consider: 5Average: 2.9 Outlier: 4.5 index 3 array size to consider: 4Average: 2.5 Outlier: 1.5 index 0 array size to consider: 3Average: 2.8333333333333335 Outlier: 3.5 index 2 array size to consider: 2Average: 2.5 Outlier: 2.5 index 0 array size to consider: 1Average: 2.5 Outlier: 2.5 index 0 array size to consider: 0

有一些可以改进的地方,我已经跳过了。你需要弄清楚:)

10-02 05:17