一次查找数组12个元素的最大值

时间:2017-05-11 12:28:27

标签: java arrays sorting max

我有一个大约有1000个条目的数组,每年分成12个条目,我试图找到每年的最大值,这样做我需要一次读取12个值并查找那些12的最大值,然后继续从数组中接下来的12个值,依此类推,直到它完成。

尝试这样做我创建了一个临时数组来存储12个值,以及每年最高分数的最终数组。下面的代码不起作用,我不确定为什么,我花了很长时间研究并尝试使用不同的解决方案,任何帮助将不胜感激:)

;WITH GLOBALHIERARCHY AS
        (
            SELECT A.OID,A.PARENTOID,A.NAME
            FROM LOCATIONDETAIL A
            WHERE OID = @LOCATIONDETAILOID
            UNION ALL
            SELECT A.OID,A.PARENTOID,A.NAME
            FROM LOCATIONDETAIL A INNER JOIN GLOBALHIERARCHY GH ON A.PARENTOID = GH.OID
        )
SELECT * FROM GLOBALHIERARCHY

4 个答案:

答案 0 :(得分:2)

很难在不知道代码生成的情况下看到代码出了什么问题,但无论如何这并不是一个很好的方法。

我假设您受限于一个长数组的输入格式,即使多维数组可能更有意义,这取决于它用于什么。

// double rain[] = new double[1268]; // input
double maxRAINyear[] = new double[(rain.length+11) / 12];
double max = Double.NEGATIVE_INFINITY;
for (int i = 0; i < rain.length; i++)
{
    if (rain[i] > max) max = rain[i];
    if (i % 12 == 0)
    {
        maxRAINyear[i / 12] = max;
        max = Double.NEGATIVE_INFINITY;
    }
}
if (rain.length % 12 != 0) maxRAINyear[maxRAINyear.length-1] = max;

计算每12个数字的最大值,而不是单独存储它们并对它们进行排序。我假设存储了整整多年。如果您想在结束时考虑部分年份,则需要对其进行修改。

答案 1 :(得分:0)

我在没有临时数组的情况下实现它,但只是迭代数组。这应该更有效率。

    int amountOfYears = rain.length/12-3;
    double maxRAINyear[]= new double [amountOfYears];
    for(int i=0;i<amountOfYears;i++){

        //Find maximum for these 12 indixes
        double max = Double.NEGATIVE_INFINITY;
        for(int j=12*i+36;j<12*(i+1)+36;j++){ //use 12*i as an offset, that way, you don't need a temp array
            if(rain[j] > max)
                max = rain[j];
        }
        //store maximum
        maxRAINyear[i] = max;

    }

如果您还需要查找部分年份,请使用此

    int amountOfYears = Math.ceil(rain.length/12f)-3;
    double maxRAINyear[]= new double [amountOfYears];
    for(int i=0;i<amountOfYears;i++){

        //Find maximum for these 12 indixes
        double max = Double.NEGATIVE_INFINITY;
        int start = 12*i+36;
        int end = Math.min(rain.length,12*(i+1)+36);
        for(int j=start;j<end;j++){ //use 12*i as an offset, that way, you don't need a temp array
            if(rain[j] > max)
                max = rain[j];
        }
        //store maximum
        maxRAINyear[i] = max;

    }

答案 2 :(得分:0)

count为11时,您将其递增到12并进入下一轮循环。现在temp[count] = rain[c];将尝试将值存储到temp的索引12中,但是只有12个条目的索引为0到11.所以我怀疑你得到的是ArrayIndexOutOfBoundsException

我相信你应该在count++声明之前移动if。这样,在创建任何破坏之前,12的计数将重置为0.

答案 3 :(得分:0)

如果数组长度不是范围的倍数而没有进行多次检查,则此解决方案具有优势。

getUserMedia