1

我正试图从课程中删除一个学生,这就是我到目前为止所得到的......

public void dropStudent() {

 String id;     
 System.out.println(" Enter student ID " );     
 id = Keyboard.readString();

  for ( int i = 0; i <= students.length - 1; i++)   
  {
      if (id.equals(students[i].displayId()))
      {
          for (int j = i; j <= students.length - 1; j++)
          {
          students[i] = students[i+1];

          }

      }      
   } 
}

所以第一个循环是针对数组的每个元素,if 语句是检查输入的 id 是否与数组中的学生 id 匹配。第二个“For”是将元素移回。当我尝试它时,它确实删除了一个特定的学生。但不是将元素移回,它只是在两个地方复制下一个元素。我试图将元素设置为 null,但它不起作用。

所以有什么建议吗?我也不允许使用数组列表或其他东西。

4

5 回答 5

4

实例化后无法更改 Java 数组的大小。如果只需要返回一个没有学生 ID 的数组。您想创建一个元素较少的新数组,并迭代原始数组,复制除您要删除的 id 之外的所有内容。

通常,您需要为此使用列表。但是鉴于您的限制,这就是我要解决的问题。

就像是:

public String[] dropStudent(String delete, String[] students){
    int length=students.length-1, i=0;
    String[] remainingStudents= new String[length];

    for(String student: students){
        // catch the edge case where 'delete' is not found, and avoid the ArrayIndexOutOfBoundsException
        if(i==remainingStudents.length){
            return students;
        }
        // Add the any non-matching students to the final array.
        if(!student.equals(delete)){
            remainingStudents[i]=student;
            i++;
        }
    }
    return remainingStudents;
}
于 2013-02-11T03:32:57.767 回答
2

替换

students[i] = students[i+1];

和:

students[j] = students[j+1];

实际上,您希望使用循环变量遍历数组的所有其余部分,j而不是使用i它表示要删除的学生的索引。

此外,您需要更换循环

for (int j = i; j <= students.length - 1; j++)

for (int j = i; j <= students.length - 2; j++)

(注意 1 变成了 2)

原因是您使用students索引 j+1 进行访问,如果 j == students.length - 1,它将等于 students.length,因此您将遇到 ArrayOutOfBounException。

最后,您必须将数组的最后一个元素设置为 null(否则最后一个学生将被复制)。或者更好的是,您可以调整数组的大小(即创建一个新数组并复制其中的新学生列表)。

此外,如果您在数组中有多个学生副本并且您只想删除第一个,则必须break在找到要删除的元素时添加。

于 2013-02-11T03:26:02.523 回答
2

您可以执行以下操作之一:

  1. 如果要消除数组给定“x”位置的元素,只需将数组下一个位置的所有元素左移即可。保持一个大小变量并减小它;

  2. 您可以有一个标志(在有学生信息的班级上),用于标记对象是否被删除。假 -> 已删除,真 -> 未删除。

  3. 您可以使用 ArrayList 而不是数组。

如果订单无关紧要,您可以简单地执行以下操作:

 for ( int i = 0; i <= students.length - 1; i++)   
      if (id.equals(students[i].displayId()))
          students[i] = students[students.length-1];

只需取最后一个元素并将其放入实际间隙中即可。但是,您必须对最后一个位置做一些事情,以某种方式将其标记为空(例如,您可以设置为 null)。

如果顺序确实很重要,那么您可以使用辅助数组:

Students [] removeFrom(Students [] old_array, int pos){
     Students [] new_array = new Students[old_array-1];
         
      for (int j = 0; j < i ; j++) new_array[j] = old_array[j];
 
      for (int j = i; j < new_array.length; j++) new_array[j] = old_array[j+1];
          
      return new_array;      
} 

在 :

for ( int i = 0; i <= students.length - 1; i++)   
      if (id.equals(students[i].displayId()))
          students = removeFrom(students, i);
于 2013-02-11T03:30:17.833 回答
2
  1. 在第二个循环中使用变量“j”
  2. 修复您的逻辑,以便“j+1”不会导致数组索引超出范围
于 2013-02-11T03:40:47.320 回答
0

我有点担心这个问题的所有回答是如何试图“解决”这个问题的,但是没有人提到这是一个糟糕的解决方案,并且有更好的方法来解决这个问题。

尝试接受对此问题的答复。

于 2020-12-28T17:22:54.250 回答