我的代码有什么问题/我该怎么做才能解决这个问题?

时间:2016-11-19 08:19:02

标签: java

在本实验中,您将创建一个程序,该程序合并两个正整数(大于0)的整数。您的程序将接受每个数组作为键盘的输入。您不知道将输入多少个值,但您可以假设每个阵列的最大长度为10,000个元素。要停止输入值,请输入零或负数。您应该忽略任何非正数输入,而不是将它们存储在数组中。

两个输入数组的元素应按递增顺序排列。换句话说,每个数组元素必须具有大于或等于前一个元素值的值。数组可能包含重复的元素。 输入两个数组后,程序必须检查以确保按顺序输入每个数组的元素。如果找到乱序元素,则打印消息“错误:数组不正确顺序”。

您的任务是将两个输入数组合并为一个新数组,所有元素按顺序排列,从最低到最高。打印输入的每个原始数组,然后打印合并的数组。 请注意,您的程序必须输出每个数字之间只有一个空格的数组。

示例运行1:

输入第一个数组的值,最多10000个值,输入零或负数以退出

3

3

5

6

8

9

-1

输入第二个数组的值,最多10000个值,输入零或负数以退出

3

4

5

6

-5

First Array:

3 3 5 6 8 9

第二阵列:

3 4 5 6

合并数组:

3 3 3 4 5 5 6 6 8 9

我的代码是:

import java.util.Scanner;
class Main{
    public static void main(String[] args)
     {
      Scanner scan = new Scanner(System.in);
      int one1=0;
      int two1=0;
      int a = 0;
      int b = 0;
      int flag = 0;
      int[]one=new int[10000];
      int[]two=new int[10000];

  System.out.println("Enter the values for the first array, up to 10000 values, enter a negative number to quit");
  while (a==0){
    int first = scan.nextInt();
    if (first<=0) a++;
    else{
      one[one1]=first;  
    one1++;
    }
  }

  System.out.println("Enter the values for the second array, up to 10000 values, enter a negative number to quit");
  while (b==0){
  int second = scan.nextInt();
  if (second<=0) b++;
    else{
      two[two1]=second; 
    two1++;
    }
  }

  System.out.println("First Array:");
  for (int i = 0 ; i < one1 ; i++){
  System.out.print(one[i]+" ");
  }
  for (int i = 0 ; i < one.length-1 ; i++){
  if (one[i]>one[i+1]) flag++;
  }  
  System.out.println("Second Array:");
  for (int i = 0 ; i < two1 ; i++){
  System.out.print(two[i]+" ");
  }
  for (int i = 0 ; i < two.length-1 ; i++){
  if (two[i]>two[i+1]) flag++;
  }
  int[]combo = new int[one.length+two.length];
  for (int i = 0 ; i < combo.length-1 ; i+=2){
    combo[i]=one[i];
    combo[i+1]=two[i];
  }
  if (flag>0) System.out.println("ERROR: Array not in correct order");
  else{
    for (int i = 0 ; i < combo.length; i++){
    System.out.print(combo[i]+" ");
}
}
}
}

这段代码一直给我运行时错误 - 我做错了什么?

3 个答案:

答案 0 :(得分:1)

对不起,你的合并算法是错的。您创建一个长度为combo的数组one.length + two.length,即20000(我认为one1 + two1就足够了)。然后你尝试通过循环遍历两个元素来填充新数组:

    for (int i = 0; i < combo.length - 1; i += 2) {

所以i是0,2,4等到19998(20000之前的最后一个偶数)。除非获得10000,否则您会尝试选择one[i],即one[10000],它位于one数组之外。这给出了ArrayIndexOutOfBoundsException。

我是怎么发现的?堆栈跟踪给出了行号。它提到的那条线是

        combo[i] = one[i];

它还提到了数字10000,所以我知道这是i的价值。

我认为您尝试做的是将onetwo中的元素0填充到combo的元素0和1中,我认为它到目前为止是有效的。然后你想要将每个数组中的元素1填充到元素2和3中;但是由于你已经为i添加了2,所以你从每个源数组中填充元素2,并且从不使用它们中的元素1。或者来自奇数指数的任何元素。

在你解决这个问题之前,请允许我再提一件事。我认为,根据您的逻辑,输入数组2 511 30将以2 11 5 30形式出现。这不符合“所有元素按顺序,从最低到最高”。所以我认为你应该考虑你的算法。

答案 1 :(得分:0)

代码存在很多逻辑错误,
对于线程“main”中的运行时错误异常java.lang.ArrayIndexOutOfBoundsException:10000 at ..

问题在于:

for (int i = 0 ; i < combo.length-1 ; i+=2){
    combo[i]=one[i];
    combo[i+1]=two[i];
}

i from 0 to 19999a,b的索引从0到9999 ,代码存在于其他simple logic problem。请再次检查。

答案 2 :(得分:-1)

家庭作业问题非常令人不悦,但Java仍然是一种相对简单的语言。如果你的程序抛出RuntimeException,你只需要阅读问题所在。

在这种情况下,循环似乎比它应该迭代的次数多,并且您正在访问其他内存空间。记下错误跟踪提供的信息,给它一些读数。