如何从数组中删除元素?

问题描述:

我试图从下降课程的学生,这是我得到迄今..如何从数组中删除元素?

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

      } 

     }  
    } 
} 

所以第一个循环是对数组的每一个元素,如果该语句是来检查id输入的是匹配数组中学生的ID。第二个“For”是将元素转移回去。当我尝试它时,它确实会删除特定的学生。但不是将元素移回,而是将这两个元素复制到两个地方。我试图将元素设置为null,但它不起作用。

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

+1

Java不是JavaScript(反之亦然)。不要混淆他们。 – Joseph 2013-02-11 03:19:38

+0

http://en.wikipedia.org/wiki/List_of_computer_term_etymologies#J – 2013-02-11 03:20:26

+0

好吧,我的错。 – 2013-02-11 03:22:02

  1. 使用变量“j”在你的第二环路
  2. 固定你的逻辑,使得“J + 1”将不导致至数组索引超出范围

更换

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,因此你将有一个A rrayOutOfBounException。

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

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

+0

另外,他应该在内循环之后添加一个'break;',除非他想消除学生的所有副本。 – 2013-02-11 03:28:55

+0

我已经试过了,它没有工作,总是给出一个例外。 – 2013-02-11 03:34:39

+0

我更新了我的答案和其他必须做的工作。尝试一下,看看是否还有一个例外。如果是,告诉我们它是什么。 – 2013-02-11 03:36:15

你可以做到以下几点:

  1. 你想消除阵列中的给定的“X”的位置,你只是 做出离开的所有元素的筛上 数组的下一个位置。保持一个大小变量减少它;

  2. 你可以有一个标志 上有学生信息,当你删除你 标记为已删除的标志。 False - >已删除,True - >未删除。可以使用ArrayList而不是数组。

如果顺序并不重要,你可以简单地做:

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

只取最后一个元素,并贴合实际的差距。但是,您必须对最后一个位置进行一些操作,将其标记为空(例如,您可以将其设置为空)。

如果订单做的事,那么你也可以使用一个辅助阵列做:

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); 
     }  
    } 
+0

我可以在不减小数组大小的情况下执行此方法吗?我的意思是通过使旧的和新的阵列具有相同的尺寸? – 2013-02-11 03:55:16

+1

是的,你可以。但是,您必须以某种方式标记删除元素。例如,您可以将其设置为null,但在将来操作数组时,您必须考虑这一点。 – dreamcrash 2013-02-11 03:57:43

+0

确实,我试图将它设置为null,并且它给了一个Exception。非常感谢你的帮助 ! – 2013-02-11 04:14:36

你不能改变实例化后的Java数组的大小。如果所有需要的都是返回一个没有学号的数组。你想创建一个新的数组少一个元素,并遍历原始数组,复制除了你想要删除的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; 
} 
+0

我不想改变数组的大小,而是想删除一个元素并将其余元素全部移回。 – 2013-02-11 03:37:30

+1

那么,你对数组中最后一个位置的要求是什么?你是否应该将它设置为空字符串?或者,只需复制最后一个元素? – 2013-02-11 03:38:39

+0

的确如此,我试图让它变成空的。我试图将它设置为null,但它不起作用。 – 2013-02-11 03:53:09