从数组中删除元素(特定于代码)

时间:2015-05-11 22:43:07

标签: java arrays eclipse loops for-loop

用户输入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;      
        }

3 个答案:

答案 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

我还有一些优化可以让你弄明白。

提示:我们每次找到异常值时都需要计算总和;)