我有一个数组,它存储用户输入的一系列双精度数。阵列的长度是用户的选择,因此会有所不同。我将数字放入一个循环中,该循环计算平均值并将异常值交换为数组的最后一个索引。计算没有离群值的新平均值,并将新离群值交换到数组的倒数第二个索引。重复此循环,直到剩余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
有一些可以改进的地方,我已经跳过了。你需要弄清楚:)