Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一次查找数组12个元素的最大值_Java_Arrays_Sorting_Max - Fatal编程技术网

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

Java 一次查找数组12个元素的最大值,java,arrays,sorting,max,Java,Arrays,Sorting,Max,我有一个大约有1000个条目的数组,这些条目每年被分成12个条目,我试图找到每年的最大值,为此我需要一次读取12个值,找到这12个值的最大值,然后从数组中转到下一个12个值,依此类推,直到完成 为了做到这一点,我制作了一个临时数组来存储其中的12个值,以及最终的数组,该数组每年的最大分数。下面的代码不起作用,我不确定为什么,我花了相当长的时间研究和尝试使用不同的解决方案,任何帮助都将不胜感激:) //double rain[]=new double[1268];这是前面声明的数组,其中包含 双倍

我有一个大约有1000个条目的数组,这些条目每年被分成12个条目,我试图找到每年的最大值,为此我需要一次读取12个值,找到这12个值的最大值,然后从数组中转到下一个12个值,依此类推,直到完成

为了做到这一点,我制作了一个临时数组来存储其中的12个值,以及最终的数组,该数组每年的最大分数。下面的代码不起作用,我不确定为什么,我花了相当长的时间研究和尝试使用不同的解决方案,任何帮助都将不胜感激:)

//double rain[]=new double[1268];这是前面声明的数组,其中包含
双倍maxRAINyear[]=新双倍[1200];
双温[]=新双温[12];
int-arrayCounter=0;
整数计数=0;
对于(int c=36;c
在不知道代码产生了什么的情况下,很难看出代码有什么问题,但无论如何,这不是一个很好的方法

我将假设您被限制为一个长数组的输入格式,即使多维数组可能更有意义,这取决于它的其他用途

// 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;
//double rain[]=新的double[1268];//输入
双倍最大降雨量年[]=新双倍降雨量[(降雨量长度+11)/12];
双最大值=双负无穷大;
对于(int i=0;imax)max=rain[i];
如果(i%12==0)
{
最大降雨量年[i/12]=最大值;
max=Double.NEGATIVE_无穷大;
}
}
如果(rain.length%12!=0)maxRAINyear[maxRAINyear.length-1]=max;

这将计算每12个数字的最大值,而不是单独存储和排序。我假设存储了整整一年。如果您想在年底计算部分年份,则需要对其进行修改。

我实现它时没有使用临时数组,只是通过迭代数组。这应该更有效率

    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=rain.length/12-3;
双倍最大降雨量年[]=新双倍[数量年];
对于(int i=0;i max)
最大值=降雨量[j];
}
//存储最大值
maxRAINyear[i]=最大值;
}

计数
为11时,将其递增至12并进入下一轮循环。现在
temp[count]=rain[c]
将尝试将值存储到
temp
的索引12中,但只有12个索引为0到11的条目。因此,我怀疑您获得了一个
数组索引OutofBoundsException


我认为您应该在
if
语句之前移动
count++
。这样,在造成任何破坏之前,计数12将被重置为0。

如果阵列长度不是范围的倍数,则此解决方案具有工作优势,无需进行多次检查

public static double[] read(double[] array, int range) { 
    double[] result = new double[array.length / range + (array.length % range > 0 ? 1 : 0 )]; //Just add one cell if the length is not a multiple of the range


    double max = array[0];
    int i = 1;
    while (i < array.length) {
        if (i % range == 0) { //Next range
            result[i / range - 1] = max; //Save last
            max = array[i]; //Get current
        } else if (array[i] > max) {
            max = array[i];
        }
        ++i;
    }
    result[result.length - 1] = max; //for the last range
    return result;
}
publicstaticdouble[]读取(double[]数组,int范围){
double[]result=new double[array.length/range+(array.length%range>0?1:0)];//如果长度不是范围的倍数,只需添加一个单元格即可
双最大值=数组[0];
int i=1;
while(imax){
max=数组[i];
}
++一,;
}
result[result.length-1]=max;//最后一个范围
返回结果;
}

C的36个值是什么?输入错误,它应该是12,36个值是因为前36个值都是0,程序的这一部分不需要。它以什么方式不起作用?它是否引发异常或产生不正确的输出?使用
哈希映射是否更有效?通过这种方式,您可以将每月的降雨量按年份分开,并直接寻址每年的ArrayList,您的代码将比您向我们展示的代码更易于阅读。1268个月,即210年8个月?只是检查一下。它确实在部分年份结束,确切地说是在第5个月,我该如何解释呢?取决于你想用它做什么。事实上,我认为部分年份被忽略了。如果您想从中获取最大值,那么在这种情况下,您需要将数组长度增加1,然后在循环结束后将max的值放入最后一个插槽中。您可以添加一个特殊情况,如果(i==rain.length-1&&i%12!=0)执行maxRAINyear[i/12+1]=maxI已编辑以包含此值。我不喜欢在循环中做额外的检查,而是在之后添加它,因为这对我来说似乎更整洁,但你可以在循环中进行检查。此操作的输出有点不正确,前3个最大值的预期输出为,119.1156.7112.6。实际产出为:;123.9149.9和145.8不必要的复杂;)看@Jamie实施已经结束了所以我不认为你会在end@gandaliter这将是因为
int amountOfYears=rain.length/12-3,它将丢失除法的小数部分(部分年份)。啊,好的,您将如何调整它以找到最小值?
    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;

    }
public static double[] read(double[] array, int range) { 
    double[] result = new double[array.length / range + (array.length % range > 0 ? 1 : 0 )]; //Just add one cell if the length is not a multiple of the range


    double max = array[0];
    int i = 1;
    while (i < array.length) {
        if (i % range == 0) { //Next range
            result[i / range - 1] = max; //Save last
            max = array[i]; //Get current
        } else if (array[i] > max) {
            max = array[i];
        }
        ++i;
    }
    result[result.length - 1] = max; //for the last range
    return result;
}