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中创建移动平均线_Java_Arrays_For Loop_Moving Average - Fatal编程技术网

如何在Java中创建移动平均线

如何在Java中创建移动平均线,java,arrays,for-loop,moving-average,Java,Arrays,For Loop,Moving Average,我需要一个程序来计算一组数字的移动平均值(我用了4, 9,3.14,1.59,86.0,35.2,9.98,1.00,0.01,2.2和3.76)。当我运行这个时,它会打印出来 “17.85999999996”九次。你们看到错误了吗 import java.util.*; public class MovingAverage { public static void main(String args[]) { Scanner scan = new Scanner

我需要一个程序来计算一组数字的移动平均值(我用了4, 9,3.14,1.59,86.0,35.2,9.98,1.00,0.01,2.2和3.76)。当我运行这个时,它会打印出来 “17.85999999996”九次。你们看到错误了吗

import java.util.*;

public class MovingAverage
{
    public static void main(String args[])
    {
        Scanner scan = new Scanner(System.in);
        // Read in the length of the moving average and the number
        // of data points
        int averageLength = scan.nextInt();
        int numDataPoints = scan.nextInt();
        // Create an array to hold the data points, and another to
        // hold the moving average
        double data[] = new double[numDataPoints];
        double movingAverage[] = new double[numDataPoints];
        // Read in all of the data points using a for loop
        for(int i = 0; i< numDataPoints; i++)
        {
            data[i]=scan.nextDouble();
        }
        // Create the moving average
        for (int i=0; i<numDataPoints; i++) 
        {
            // Calculate the moving average for index i and put
            // it in movingAverage[i]. (Hint: you need a for
            // loop to do this. Make sure not to use i as your
            // loop variable. Also, make sure to handle the
            // case where i is not large enough (when i<averageLength-1). 
            double sum= 0.0;
            for(int j=0; j<numDataPoints; j++)
            {

                sum=sum+data[j];
                movingAverage[i]=sum/j;
            }

        }
        // Print the moving average, one value per line
        for (int i=0; i<numDataPoints; i++)
        {
            System.out.println(movingAverage[i]);
        }
    }
}
import java.util.*;
公共类移动平均值
{
公共静态void main(字符串参数[])
{
扫描仪扫描=新扫描仪(System.in);
//读入移动平均线的长度和数字
//数据点的数量
int averageLength=scan.nextInt();
int numDataPoints=scan.nextInt();
//创建一个数组来保存数据点,并创建另一个数组来保存数据点
//保持移动平均线
双精度数据[]=新双精度[numDataPoints];
double movingAverage[]=新的double[NumData Points];
//使用for循环读入所有数据点
对于(int i=0;i对于(int i=0;i您每次都在循环所有数据。对于(int j=(i>=averageLength?i-averageLength/2:0);j您每次都在循环所有数据。对于(int j=(i>=averageLength?i-averageLength/2:0)您应该有
;j
移动平均线有一个窗口。在这种情况下,窗口的宽度是
averageLength
。这是你平均的点数


在创建移动平均线的循环中,您需要以某种方式使用
averageLength
。您现在不需要了。

因为这看起来像一个赋值,所以我给您一个提示

移动平均线有一个窗口。在这种情况下,窗口的宽度是
averageLength
。这是你平均的点数


在创建移动平均线的循环中,您需要以某种方式使用
averageLength
。您现在不需要这样做。

for
的内部
正在迭代所有数组,这就是为什么您总是得到相同的平均值(整个数组的平均值),而应该从0迭代到当前的
外部
的编号

您的移动平均值正在根据内部
for
j
进行更新;这意味着它将在每个新循环中覆盖以前的值,这应该在外部
for
中,而不是使用
i
作为索引的内部循环中

您正在除以
sum/j
来计算平均值,每个新的内环
j
您将除以
0
第一个
sum
。我相信您的意思是使用
j+1
,索引与
当前长度不同

故障排除提示:

避免使用变量循环数组,应使用
array.length

为了重现您的问题,您可以给我们单独的问题,而不是您当前的代码…即:

double[] data = new double[] { 1, 5, 8 }; //your real inputs. 
double[] movingAverage = new double[data.length];
for (int i = 0; i < data.length; i++) {
  double sum = 0.0;
  for (int j = 0; j <= i; j++) {
   ...
  }
}
double[]data=newdouble[]{1,5,8};//实际输入。
double[]移动平均值=新的double[data.length];
对于(int i=0;ifor(int j=0;j你的内部
for
迭代所有数组,所以你总是得到相同的平均值(整个数组的平均值),你应该从0迭代到外部
for
的当前数

您的移动平均值正在根据内部
for
j
进行更新;这意味着它将在每个新循环中覆盖以前的值,这应该在外部
for
中,而不是使用
i
作为索引的内部循环中

您正在除以
sum/j
来计算平均值,每个新的内环
j
您将除以
0
第一个
sum
。我相信您的意思是使用
j+1
,索引与
当前长度不同

故障排除提示:

避免使用变量循环数组,应使用
array.length

为了重现您的问题,您可以给我们单独的问题,而不是您当前的代码…即:

double[] data = new double[] { 1, 5, 8 }; //your real inputs. 
double[] movingAverage = new double[data.length];
for (int i = 0; i < data.length; i++) {
  double sum = 0.0;
  for (int j = 0; j <= i; j++) {
   ...
  }
}
double[]data=newdouble[]{1,5,8};//实际输入。
double[]移动平均值=新的double[data.length];
对于(int i=0;i对于(int j=0;j下一次,在发布作业之前,将作业的评论从问题中删除。但是,既然你在这方面似乎很新,那么想想你将如何浏览数据,并让它这样做。你应该尝试确保每个循环都在正确的点停止,并且记住,如果没有更多的麻木,你会停止ers(比如当你做内循环时,你只能得到3个数字而不是4个)程序也需要停止。请确保您的代码正在对此进行检查。

下次发布作业之前,请将有关作业的注释排除在问题之外。但是,由于您在这方面似乎很新,请思考您将如何处理数据,并确保数据正确。您应该尝试确保每个循环都在正确的点停止,记住,如果你想在没有更多的数字时停止(比如当你做内环时,你只能得到3个数字而不是4个),程序也需要停止。确保你的代码正在检查这一点。

在移动平均中,你需要有某种窗口大小

您的窗口大小为averageLength,因此它的外观如下所示:

    if(i <averageLength-1)
    {
        double sum= 0.0;

        for(int j = 0; j < averageLength; j++)
        {
            sum += data[i-j];
        }

        movingAverage[i]=sum/averageLength;
    }

如果(i在移动平均线中,您需要某种窗口大小

您的窗口大小为averageLength,因此它的外观如下所示:

    if(i <averageLength-1)
    {
        double sum= 0.0;

        for(int j = 0; j < averageLength; j++)
        {
            sum += data[i-j];
        }

        movingAverage[i]=sum/averageLength;
    }

如果(i没有任何附加细节,您可能需要一个未加权的移动平均值。在输入数组
A[i]
的任意点
A
的长度
N
(带
0无任何附加A