好吧,我是Java的新手,我只是在上课,而且我在课堂上遇到了一些障碍。除了最后一件事,我已经成功地完成了我的最终计划的每一个方面。
public static void remove(String studentID)
{
Integer foundLocation = 0;
for (int i = 0; i < studentList.size(); i++)
{
if (studentList.get(i).getStudentID().compareTo(studentID) == 0)
{
//This means we have found our entry and can delete it
foundLocation = i;
}
}
System.out.println(foundLocation);
if (foundLocation != 0)
{
System.out.println(studentList);
studentList.remove(foundLocation);
System.out.println(foundLocation.getClass().getName());
System.out.println("Student ID removed: " + studentID);
System.out.println(studentList);
}
else
{
System.out.println("Sorry, " + studentID + " not found.");
}
代码似乎应该有用。但是,我得到的是remove
实际上并没有做任何事情。我的额外打印件在那里验证。 ArrayList
只是平原没有变化。
但是,如果我只是替换:
studentList.remove(foundLocation);
有类似的东西:
studentList.remove(3);
它完全消除了。
foundLocation
是Integer
。
有人可以向我解释我在这里发生了什么吗?
对于熟悉Java的人来说,我觉得这很明显,但是我很想念它。
答案 0 :(得分:3)
这是一个令人讨厌的重载,它隐藏在Collections API设计中。
有两种remove
方法,一种是使用int
调用的方法,另一种是使用Object
调用的方法,它们执行的操作非常不同。
不幸的是,Integer
也是Object
,即使您想将其用作int
(并在其他几个地方使用它,感谢不幸的是,自动装箱不适用于remove
)。
remove(1)
将按索引删除(第二个元素)。
remove(Integer.valueOf(1))
将删除对象的值(列表中的第一个“1”)。
将这两种方法赋予两种不同的名称可能更明智。
在您的情况下,请将foundPosition
更改为int
。
答案 1 :(得分:0)
ArrayList
有两个remove
方法,一个是remove(int index),另一个是remove(Object object),
您的foundLocation
类型为Integer
,在使用时它将作为参考,因此当您致电remove(foundLocation)
时,它会调用remove(Object)
,尝试查找元素== foundLocation,它找不到这个删除什么,一旦你将类型更改为int,它将删除index foundLocation中的元素,请参考方法doc。
答案 2 :(得分:0)
有两个&#39;删除&#39; ArrayList类中的方法。一个接受Object类型,另一个接受int类型。通过使用Integer对象,您将在列表中找到一个等于Integer对象的元素。但是,当您按int类型删除时,您将按列表中元素的位置移动。
studentList.remove(foundLocation)将导致ArrayList检查Integer对象,该对象等于foundLocation引用的对象。这是对象相等性检查。具有相同值的两个不同的Integer对象被认为是不同的,即使它们具有相同的数值。
studentList.remove(3)将导致ArrayList删除列表中的第四个元素。