我正试图让一名学生退学,这就是我到目前为止所做的事情。
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,但它不起作用。
所以有什么建议吗?我也不允许使用数组列表或其他东西。
答案 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)
您可以执行以下操作:
你想要消除数组中给定的'x'位置 在下一个位置的所有元素左侧筛选 阵列。保持大小变量减少它;
你可以有一面旗帜 在课堂上有学生信息,当你删除你 将此标记标记为已删除。假 - &gt;删除,True - &gt;没有删除。
您可以使用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;
}
in:
for ( int i = 0; i <= students.length - 1; i++)
{
if (id.equals(students[i].displayId()))
{
students = removeFrom(students, i);
}
}
答案 3 :(得分:1)
答案 4 :(得分:0)
我有点担心这个问题的所有回答都试图“解决”这个问题,但没有人提到这是一个糟糕的解决方案,有更好的方法来解决这个问题。
尝试对此 question 接受的响应。