0

问题:

在放弃期结束后更新学生成绩列表的程序。程序应该从用户数量和他们的索引中读取被放弃的学生,然后程序应该将剩余学生的成绩复制到新的数组中。此外,程序应同时显示原始列表和更新列表。[提示:新数组的长度必须与剩余学生人数相当]

我的代码:

public class Q5{
  static Scanner scan = new Scanner (System.in);
  public static void main (String args[]){

    double [] list={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10};
    System.out.println("enter number of students who dropped:");
    int num=scan.nextInt();
    double [] list2 = new double [num];

    System.out.println("Enter index Of  the student who dropped ");
    for (int j=1 ; j<=num ; j++)
    {
      System.out.println("student" + j + ":");
      int index=scan.nextInt();
      list[index]=0;
    }

    int  j=0;
    for(int i=0; i<list.length ; i++)
    if (list[i]!=0)
    {
      list2[j]=list[i];
      j++;
    }
    System.out.print("The original list : " );
    for(int i=0; i<list.length ; i++)
    System.out.print(list[i] + " " );

    System.out.print("remaining students " );
    for(int i=0; i<list2.length ; i++)
    System.out.print(list2[i] + " " );
  }
}

问题是什么 ?它不工作!在第 16 行它说:

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 4 在 Q5.main(Q5.java:23)

我该如何纠正这个

4

7 回答 7

2

那是因为你的list2.

您不应将其大小设置为num,而应设置为原始列表的大小。因为list2将包含与原始 一样多的元素list。您只需num要从用户那里获取那么多输入并为这些索引分配值0

double[] list2 = new double[list.length]; // This should be the size of your list2

如果您不需要保留原始大小,那么您需要按照@Joetjah的建议从原始大小中减去 num 。

double[] list2 = new double[list.length - num]; // This should be the size of your list2
于 2013-11-13T09:42:45.397 回答
0

猜猜预定义数组“列表”的问题。

第 1 步:使用其中一种初始化方式创建列表。这里大小是固定的。

第 2 步:从用户那里获取输入:假设它是 11。

list不需要包含作为输入给出的大小。

于 2013-11-13T09:44:24.297 回答
0

list2您使用错误的大小进行初始化。

您从用户数量中获取已放弃的学生,然后尝试放入list2所有剩余的学生。

double [] list2 = new double [list.length - num];
于 2013-11-13T09:47:11.613 回答
0

它工作正常

导入 java.util.Scanner;

public class Q5 {
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {

        double[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        System.out.println("enter number of students who dropped:");
        int num = scan.nextInt();
        double[] list2 = new double[num - 1]; // should be num-1

        System.out.println("Enter index Of  the student who dropped ");
        for (int j = 0; j < num; j++) {
            System.out.println("student" + j + ":");
            int index = scan.nextInt();
            list[index] = 0;
        }

        int j = 0;
        for (int i = 0; i < num; i++) {
            if (list[i] != 0) {
                list2[j] = list[i];
                j++;
            }
        }
        System.out.print("The original list : ");
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }

        System.out.print("remaining students ");
        for (int i = 0; i < list2.length; i++) {
            System.out.print(list2[i] + " ");
        }
    }
}

输出是

 enter number of students who dropped:
    2
    Enter index Of  the student who dropped 
    student0:
    1
    student1:
     2
    The original list : 1.0 0.0 0.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 remaining students 1.0 
于 2013-11-13T09:49:42.313 回答
0

如果用户输入的值超出数组的范围,您的代码将失败:

int index=scan.nextInt();
list[index]=0; // This may fail. Value entered by the user may exceed the array length
于 2013-11-13T09:43:39.420 回答
0

伪代码:

你从 10 个学生开始。假设你想放弃 2 名学生。这意味着您将list2大小设置为 2。

接下来你要做的,是尝试将所有学生 (10) 添加listlist2。但是,list2对于这个来说太小了。因此你得到你的例外。

你想要的,是这样的:

double [] list2 = new double [list.length - num];
于 2013-11-13T09:43:43.977 回答
-1

这将删除您遇到的异常。从下次开始,您不再使用静态值。

编辑: 自己为任何变量赋值不是一个好习惯。由于数组的大小为 10。如果用户输入超过 10 个被丢弃的学生,则会导致问题。

import java.util.*;

public class Q5 {
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {

        double[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        System.out.println("enter number of students who dropped:");
        int num = scan.nextInt();
        double[] list2 = new double[list.length-num]; // should be num-1

        System.out.println("Enter index Of  the student who dropped ");
        for (int j = 0; j < num; j++) {
            System.out.println("student" + j + ":");
            int index = scan.nextInt();
            list[index] = 0;
        }

        int j = 0;
        for (int i = 0; i < list.length; i++) {
            System.err.println(""+list[i]);
            if (list[i] > 0) {

                list2[j] = list[i];
                j++;
            }
        }
        System.out.print("The original list : ");
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }

        System.out.print("remaining students ");
        for (int i = 0; i < list2.length; i++) {
            System.out.print(list2[i] + " ");
        }
    }
}
于 2013-11-13T10:36:41.270 回答