如何从数组中删除元素?
我试图从下降课程的学生,这是我得到迄今..如何从数组中删除元素?
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,但它不起作用。
有什么建议吗?我也不允许使用数组列表或其他东西。
- 使用变量“j”在你的第二环路
- 固定你的逻辑,使得“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
。
另外,他应该在内循环之后添加一个'break;',除非他想消除学生的所有副本。 – 2013-02-11 03:28:55
我已经试过了,它没有工作,总是给出一个例外。 – 2013-02-11 03:34:39
我更新了我的答案和其他必须做的工作。尝试一下,看看是否还有一个例外。如果是,告诉我们它是什么。 – 2013-02-11 03:36:15
你可以做到以下几点:
你想消除阵列中的给定的“X”的位置,你只是 做出离开的所有元素的筛上 数组的下一个位置。保持一个大小变量减少它;
你可以有一个标志 上有学生信息,当你删除你 标记为已删除的标志。 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);
}
}
我可以在不减小数组大小的情况下执行此方法吗?我的意思是通过使旧的和新的阵列具有相同的尺寸? – 2013-02-11 03:55:16
是的,你可以。但是,您必须以某种方式标记删除元素。例如,您可以将其设置为null,但在将来操作数组时,您必须考虑这一点。 – dreamcrash 2013-02-11 03:57:43
确实,我试图将它设置为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;
}
我不想改变数组的大小,而是想删除一个元素并将其余元素全部移回。 – 2013-02-11 03:37:30
那么,你对数组中最后一个位置的要求是什么?你是否应该将它设置为空字符串?或者,只需复制最后一个元素? – 2013-02-11 03:38:39
的确如此,我试图让它变成空的。我试图将它设置为null,但它不起作用。 – 2013-02-11 03:53:09
Java不是JavaScript(反之亦然)。不要混淆他们。 – Joseph 2013-02-11 03:19:38
http://en.wikipedia.org/wiki/List_of_computer_term_etymologies#J – 2013-02-11 03:20:26
好吧,我的错。 – 2013-02-11 03:22:02