用户输入x-of整数,这些整数存储在一个数组中(' dataA')。计算数据的平均值,并删除最远的元素('异常值')。我不知道如何删除元素并需要知道。
此外,程序删除一个异常值,它计算新的平均值并删除下一个异常值,直到剩下一个元素。
public static Scanner sc1 = new Scanner(System.in);
public static int dataN = sc1.nextInt();//number of data elements
public static double[] dataA = new double[dataN];//array storing elements
for(int index = 0; index<dataA.length; index++)//increments index
{
double lengthA = dataA.length;//length of array
double avg = sum/lengthA;//avg of elements
double outlier = dataA[0];//outlier
double index_outlier = 0;//index of outlier
double dif_in = Math.abs(avg - dataA[index]);//difference of avg & element
double dif_out = Math.abs(avg - outlier);//difference of avg & outlier
if(dif_in > dif_out)
{
outlier = dataA[index];
index_outlier = index;
}
答案 0 :(得分:1)
最佳解决方案是创建一个新数组,复制前一个元素,除了要删除的元素(使用for循环和一个比你的空间少1的数组),然后将原始数组设置为新的。
答案 1 :(得分:1)
由于您需要可变大小的数据结构,因此请使用LinkedList而不是原始数组。
这样做的更好的解决方案如下: 1)将所有值存储在LinkedList中。使用插入排序将元素添加到列表中时对其进行排序,或者在使用Collections.sort(list)添加所有元素后对其进行排序。 2)找出平均值。这可以在添加列表中的元素时完成。无需再次遍历列表。 3)由于所有值都是按排序方式,因此异常值将是LinkedList中的第一个或最后一个元素。比较diff_first和diff_last并删除更大的。 4)重新计算平均值。为此,您可以使用一个非常简单的等式: new_avg =((avg * l)-outlier_value)/(l-1); 其中l =计算avg的值的数量。 5)重复步骤3和4,直到LinkedList中只剩下1个元素。
答案 2 :(得分:1)
您可以尝试将异常值与Array的最后一个元素交换并继续使用数组,但要考虑少一个元素。如果你对它很好,那么你可以使用Array
之类的:
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: 6
Average: 3.6666666666666665 Outlier: 7.5 index 4 array size to consider: 5
Average: 2.9 Outlier: 4.5 index 3 array size to consider: 4
Average: 2.5 Outlier: 1.5 index 0 array size to consider: 3
Average: 2.8333333333333335 Outlier: 3.5 index 2 array size to consider: 2
Average: 2.5 Outlier: 2.5 index 0 array size to consider: 1
Average: 2.5 Outlier: 2.5 index 0 array size to consider: 0
我还有一些优化可以让你弄明白。
提示:我们每次找到异常值时都需要计算总和;)