Java作业测试

Java作业测试,java,data-structures,Java,Data Structures,我目前正试图为我的Data Structures类修改一个Java家庭作业程序,该类在表中显示MaxSumTest程序的输出 我已经创建了四个数组,并将它们放在计算计时信息的一个循环中。我试图用一个算法的计时信息填充每个数组。因此每个数组将有4个元素。然而,每次我运行我的程序修订版时,我都会得到一个越界错误 我唯一修改的方法是getTimingInfo。这是我的修订: public static void getTimingInfo( int n, int alg ) { int []

我目前正试图为我的Data Structures类修改一个Java家庭作业程序,该类在表中显示MaxSumTest程序的输出

我已经创建了四个数组,并将它们放在计算计时信息的一个循环中。我试图用一个算法的计时信息填充每个数组。因此每个数组将有4个元素。然而,每次我运行我的程序修订版时,我都会得到一个越界错误

我唯一修改的方法是getTimingInfo。这是我的修订:

public static void getTimingInfo( int n, int alg )
{
    int [] test = new int[ n ];

    long startTime = System.currentTimeMillis( );;
    long totalTime = 0;



   //create an array for each Algorithm
    long[] alg4;
    long[] alg3;
    long[] alg2;
    long[] alg1;

    //allocate memory for 5 long ints 

    alg4 = new long[5];
    alg3 = new long[5];
    alg2 = new long[5];
    alg1 = new long[5];

   int i;
   int j;
   int index = 0;

   for( i = 0; totalTime < 4000; i++ )
   {
       for( j = 0; j < test.length; j++ )
           test[ j ] = rand.nextInt( 100 ) - 50;
    index = j;
       switch( alg )
       {
         case 1:
           maxSubSum1( test );
           break;
         case 2:
           maxSubSum2( test );
           break;
         case 3:
           maxSubSum3( test );
           break;
         case 4:
           maxSubSum4( test );
           break;
       }

       totalTime = System.currentTimeMillis( ) - startTime;

   }

    alg1[index] = totalTime * 1000 / i;
    alg2[index] = totalTime * 1000 / i;
    alg3[index] = totalTime * 1000 / i;
    alg4[index] = totalTime * 1000 / i;

    //Build first column of table
    System.out.println("Size of N Algorithms\t" + "250\t" + "2500\t" + "25000\t" + "250000");

    System.out.println("Alg #4\t" + alg4[0] + "\t" + alg4[1] + "\t" + alg4[2] + "\t" + alg4[3] + "\t" + alg4[4]);
    System.out.println("Alg #3\t" + alg3[0] + "\t" + alg3[1] + "\t" + alg3[2] + "\t" + alg3[3] + "\t" + alg3[4]);
    System.out.println("Alg #2\t" + alg2[0] + "\t" + alg2[1] + "\t" + alg2[2] + "\t" + alg2[3] + "\t" + alg2[4]);
    System.out.println("Alg #1\t" + alg1[0] + "\t" + alg1[1] + "\t" + alg1[2] + "\t" + alg1[3] + "\t" + alg1[4]);


    /*

    System.out.println( "Algorithm #" + alg + "\t"
         + "N = " + test.length
         + "\ttime = " + ( totalTime * 1000 / i ) + " microsec" );
    */


 }
任何正确方向的建议或指点都将不胜感激

long[] alg1;
alg4 = new long[5];
可以更好地表示为

long[] alg1 = new long[5];

maxSubSum3( test );
写得像

maxSubSum3(test);

int j;
int index = 0;
实际上做同样的事情

只想挑出几点

可以更好地表示为

long[] alg1 = new long[5];

maxSubSum3( test );
写得像

maxSubSum3(test);

int j;
int index = 0;
实际上做同样的事情


只选取几个点。

您正在将alg4、alg3、alg2和alg1设置为大小5,而不是您所说的需要的大小4。

您正在将alg4、alg3、alg2和alg1设置为大小5,而不是您所说的需要的大小4。

更新数组元素的行不应该在内部循环中吗

alg1[index] = totalTime * 1000 / i;
alg2[index] = totalTime * 1000 / i;
alg3[index] = totalTime * 1000 / i;
alg4[index] = totalTime * 1000 / i;

您在循环外部分配它们,其中索引的值为5,因此超出了范围。

更新数组元素的行不应该在内部循环内部吗

alg1[index] = totalTime * 1000 / i;
alg2[index] = totalTime * 1000 / i;
alg3[index] = totalTime * 1000 / i;
alg4[index] = totalTime * 1000 / i;

您在循环外分配它们,其中索引的值为5,因此超出了范围。

我不确定您到底想做什么,但我认为您真正想做的是多次调用getTimingInfo,然后将结果分配给表,而不是更改getTimingInfo的内部工作方式


这要求您定义将在其中存储getTimingInfo之外的计时数据的数组,然后getTimingInfo内部的唯一更改将是存储到已定义的数组,而不是打印。

我不确定您到底想做什么,但我认为您真正想要做的是多次调用getTimingInfo,然后将结果分配给一个表,而不是更改getTimingInfo的内部工作方式


这要求您定义数组,在其中存储getTimingInfo外部的计时数据,然后getTimingInfo内部的唯一更改将是存储到已定义的数组,而不是打印。

j最终将变为等于n,索引设置为j,因此如果指定n>5,您将访问alg超出其边界(定义为5)。j最终将等于n,索引设置为j,因此,如果您指定n>5,您将访问alg超出其边界(定义为5)。无法确定修复,但知道它与此相关。n=j=index,因此n>4会导致越界!好眼力:这就是我最初使用它们的地方,但在第一次迭代中,我得到了被零除的错误,我等于零。实际上,这是唯一可以放置它们而不使索引超出范围的地方。我不知道你的程序的功能,但也许你可以除以I+1?我无法确定修复方法,但我知道它与此相关。n=j=index,因此n>4会导致越界!好眼力:这就是我最初使用它们的地方,但在第一次迭代中,我得到了被零除的错误,我等于零。实际上,这是唯一可以放置它们而不使索引超出范围的地方。我不知道你的程序的功能,但也许你可以除以I+1?原始程序每行输出一个结果。例如,算法4=xxx,算法3=xxx。。。。我想做的是将每个算法的所有时间的结果存储到它们自己的数组中,然后以表格形式打印出来。我的观点是,您在错误的位置收集数据。getTimingInfo方法不会同时测试所有算法。它只测试一个算法,即每个调用由alg参数指定的算法。因此,创建数组并在函数中打印出来是没有意义的,每次调用只创建数组的一个条目。将此逻辑放在main中的正确位置是多次调用getTimingInfo的循环所在的位置。您完全正确。在这件事上我的逻辑完全错了。我将用main方法中的数组操作代码重写它。谢谢。原始程序每行输出一个结果。例如,算法4=xxx,算法3=xxx。。。。我想做的是将每个算法的所有时间的结果存储到它们自己的数组中,然后以表格形式打印出来。我的观点是,您在错误的位置收集数据。getTimingInfo方法不会同时测试所有算法。它只测试一个算法,即每个调用由alg参数指定的算法。因此,创建数组并在函数中打印出来是没有意义的,每次调用只创建数组的一个条目。Th
将此逻辑放在main中的正确位置,即多次调用getTimingInfo的循环所在的位置。您完全正确。在这件事上我的逻辑完全错了。我将用main方法中的数组操作代码重写它。谢谢