我如何解决这个数组和循环?正确的输出但是

时间:2015-11-12 02:17:03

标签: java arrays loops

我的目标是编写一个循环,将newScores设置为左移一次的oldScores,将元素0复制到结尾。

修改:这是我的主要问题,我初始化了newScores[3] = oldScores[0];,但是当没有oldScores时,问题就是for循环使得i = 4 [ 4]或newScores [4]但是因为我将newScores [3]初始化为oldScores [0],它编译并运行,但问题是[4]根本不在数组中。我该如何摆脱这个问题?我离这么近,但距离我很烦。

示例:

If oldScores = {10, 20, 30, 40}, then newScores = {20, 30, 40, 10}

有趣的是我有正确的输出,但我使用它的学习网站告诉我,我有正确的输出,但它也显示这个"运行时错误(通常由于无效的数组/向量访问,除以0等)。测试中止了。"。

public class StudentScores {
   public static void main (String [] args) {
      final int SCORES_SIZE = 4;
      int[] oldScores = new int[SCORES_SIZE];
      int[] newScores = new int[SCORES_SIZE];
      int i = 0;

      oldScores[0] = 10;
      oldScores[1] = 20;
      oldScores[2] = 30;
      oldScores[3] = 40;
      newScores[3] = oldScores[0];
      for(i=0; i<SCORES_SIZE-1; i++){
         newScores[i] = oldScores[i +1];
      }

      for (i = 0; i < SCORES_SIZE; ++i) {
         System.out.print(newScores[i] + " ");
      }
      System.out.println();

      return;
   }
}

8 个答案:

答案 0 :(得分:1)

问题出现在第二个循环中,你有++ i。 i ++和++我有两个不同的含义。这是一个描述你意义的链接。 What is the difference between ++i and i++?。如果你改变它,你不应该再得到错误。以下是您的代码中的更改。

public class StudentScores {
  public static void main (String [] args) {
  final int SCORES_SIZE = 4;
  int[] oldScores = new int[SCORES_SIZE];
  int[] newScores = new int[SCORES_SIZE];
  int i = 0;

  oldScores[0] = 10;
  oldScores[1] = 20;
  oldScores[2] = 30;
  oldScores[3] = 40;
  newScores[3] = oldScores[0];
  for(i=0; i<SCORES_SIZE-1; i++){
     newScores[i] = oldScores[i +1];
  }

  for (i = 0; i < SCORES_SIZE; i++) {
     System.out.print(newScores[i] + " ");
  }
  System.out.println();

  return;
  }
}

答案 1 :(得分:0)

在你的第二个for循环中,你在使用它之前递增i,即++ i

这意味着,我将在循环中的System.out之前递增。由于您将i初始化为0,因此它将打印的第一个索引是1(不是0)。它会尝试打印

newScores[1]
newScores[2]
newScores[3]
newScores[4]

最后一个会导致异常(索引无效)。将for循环更改为

for (i = 0; i < SCORES_SIZE; i++) {

(其中i在使用后递增)

答案 2 :(得分:0)

我注意到你以错误的方式使用i ++和++ i 第一个循环:newScores数组索引从0到2,每次增加1 第二个循环:您正在尝试打印newScores但是使用++ i进行循环。这意味着newScores索引将从1打印到3。 =&GT;索引3处的错误。 解决方案:用替换第二个循环 for (i = 0; i < SCORES_SIZE - 1; i++)

答案 3 :(得分:0)

只需进行简单的更改即可使代码正常工作

oldScores[0] = 10;
      oldScores[1] = 20;
      oldScores[2] = 30;
      oldScores[3] = 40;
      newScores[3] = oldScores[0];
      for(i=0; i<SCORES_SIZE-1; i++){
         newScores[i] = oldScores[i +1];
      }
 /* REMOVE THIS PART   
          for (i = 0; i < SCORES_SIZE; ++i) {
             System.out.print(newScores[i] + " ");
          }
*/TILL HERE

// USE THE FOLLOWING
for (i = 0; i < SCORES_SIZE; i++) {
     System.out.print(newScores[i] + " ");
  }
  System.out.println();

因为您在使用之前增加了导致错误的值。

答案 4 :(得分:0)

为了克服&#34;运行时错误(通常由于无效的数组/向量访问,除以0等)。测试中止了。&#34;我使用了if / else语句:

for (i = 0; i < SCORES_SIZE; i++)
   {
      if (i == (SCORES_SIZE - 1))
      {
         newScores[i] = oldScores[0];
      }
      else
      {
         newScores[i] = oldScores[i + 1];
      }
   }

答案 5 :(得分:0)

这是将通过所有测试的答案:

log4j.appender.loggerId.MaxFileSize=2MB

答案 6 :(得分:0)

为什么要重新发明轮子? Java API已经允许执行此类操作

1-创建方法

    public static int[] switchScores(int[] oldScores){
      if(oldScores != null && oldScores.length > 0) {
        final int SIZE = oldScores.length;

        int[] newScores = new int[SIZE];
        newScores = Arrays.copyOfRange(oldScores, 1, SIZE+1);
        newScores[SIZE-1] = oldScores[0];

        return newScores;
      }
      else{
        throw new IllegalArgumentException("Null or Empty Array provided");
      }
   }

2-运行测试

public static void main(String[] args) {
    int[] input = new int[]{10, 20, 30, 40};
    System.out.println("Old scores : " + Arrays.toString(input));

    int[] output = switchScores(input);
    System.out.println("New scores : " + Arrays.toString(output));
}   

答案 7 :(得分:0)

This is it:

for (i = 0; i < newScores.length; ++i) {

    // if statement to shift numbers to the left starting with the 2nd value
    if (i > 0) {
       newScores[i + 1] = oldScores[i];
    }

    // This will make the 1st value move and become newScores last value regardless of SCORES_SIZE value
    else {
       newScores[newScores.length - 1] = oldScores[i];
    }
}