如何从数组中删除元素?

时间:2013-02-11 03:18:02

标签: java

我正试图让一名学生退学,这就是我到目前为止所做的事情。

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,但它不起作用。

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

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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++)

students

(注意1中的1改变了)

原因是您正在使用索引j + 1访问break,如果j == students.length - 1,则将等于students.length,因此您将拥有ArrayOutOfBounException。

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

此外,如果阵列中有多个学生副本,而您只想删除第一个副本,则必须在找到要删除的元素时添加{{1}}。

答案 2 :(得分:2)

您可以执行以下操作:

  1. 你想要消除数组中给定的'x'位置 在下一个位置的所有元素左侧筛选 阵列。保持大小变量减少它;

  2. 你可以有一面旗帜     在课堂上有学生信息,当你删除你     将此标记标记为已删除。假 - &gt;删除,True - &gt;没有删除。

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

  4. 如果订单无关紧要,您可以这样做:

     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;      
    } 
    

    in:

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

答案 3 :(得分:1)

  1. 在第二个循环中使用变量“j”
  2. 修复你的逻辑,使“j + 1”不会导致数组索引越界

答案 4 :(得分:0)

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

尝试对此 question 接受的响应。