英文:
Java console - Remove element from arraylist, still shows up when printing
问题
我有一个ArrayList,我可以使用构造函数添加元素。这部分完全正常,当我打印时它们会显示出来,但是当我尝试删除它们时,即使在打印时仍然显示在列表中,但当我尝试第二次删除它们时,它会显示"NullPointerException",或者进入我的故障安全else if。所以问题应该出现在打印部分,或者我完全错误地思考了吗?它没有在删除元素后更新ArrayList 吗?
谢谢。
实例部分 - 创建ArrayList/构造函数(employeeVar = int)
static Employees[] employee = new Employees[employeeVar];
static List<Employees> EmployeesAL = new ArrayList<>(Arrays.asList(employee));
打印ArrayList
else {
System.out.println("id: " + EmployeesAL.get(i).getEmployeeID() + "Name: " + EmployeesAL.get(i).getEmployeeName());
}
删除元素
else if (employee[idToRemove].getEmployeeID() == idToRemove && customer[idToRemove].getEmployeeName() != null) {
EmployeesAL.remove(idToRemove);
employee[idToRemove] = null;
}
}
英文:
I have an arraylist which I can add to using constructors. That works perfectly fine, and they show up when printing, but when I remove them, it still shows up in the list when printing, even though when I try to remove it for a second time, it says "NullPointerException", or goes to my failsafe else if. The problem therefore have to be in the printing part, or am I thinking completely incorrectly? Is it not updating the arraylist after removing an element?
Thank you.
Instance stuff - Creating Arraylist/constructor(employeeVar = int)
static Employees[] employee = new Employees[employeeVar];
static List<Employees> EmployeesAL = new ArrayList<>(Arrays.asList(employee));
Printing Arraylist
else{
System.out.println("id: " + EmployeesAL.get(i).getEmployeeID() + "Name: " + EmployeesAL.get(i).getEmployeeName());
}
Removing element
else if (employee[idToRemove].getEmployeeID() == idToRemove && customer[idToRemove].getEmployeeName() != null){
EmployeesAL.remove(idToRemove);
employee[idToRemove] = null;
}
}
答案1
得分: 1
你设置的方式中,EmployeesAL
和 employee
是完全未绑定的。对其中一个的更改不会反映在另一个上面。
所以,当你的 employee
中有 [Jane, Joe, Jack]
时,一开始 EmployeesAL
也是 [Jane, Joe, Jack]
。但是如果你之后移除一个雇员,效果是数组中的条目被置为空,但是数组列表中的条目被移除。所以,移除 Joe 会导致 employee
变为 [Jane, null, Jack]
,而 EmployeesAL
变为 [Jane, Jack]
。此时 Jack 在数组中的位置是索引 2(employee[2]
),而在数组列表中是索引 1(EmployeesAL.get(1)
)。你的代码检查 employee[idToRemove]
,然后请求 EmployeeAL
移除该索引,很明显,这会失败。
为什么你有两种包含相同数据的数据结构?停止这样做。选择其中一个:要么使用 Employee[] employees
,要么使用 List<Employee>
。你可能只想要后者:
List<Employee> employees = new ArrayList<>();
employees.addAll(Arrays.asList(new Employee("Jane"), new Employee("Joe"), 等等);
英文:
The way you set it up, EmployeesAL
and employee
are completely unbound. A change in one is not reflected in the other.
So, when you have: [Jane, Joe, Jack]
in your employee
, that means at first, EmployeesAL
is also [Jane, Joe, Jack]
. But if you then remove an employee, the effect is that the entry in the array is nulled out, but the entry in the arraylist is removed. So, removing Joe results in employee
being [Jane, null, Jack]
and EmployeesAL
being [Jane, Jack]
. Now Jack's position in the array is index 2 (employee[2]
) and in the arraylist it's 1: EmployeesAL.get(1)
. Your code checks employee[idToRemove]
and then asks EmployeeAL
to remove that index, which, obviously, is going to fail.
Why do you have 2 data structures with the same data? Stop doing that. Pick one: Either have Employee[] employees
, or have List<Employee>
. You probably want only the latter:
List<Employee> employees = new ArrayList<>();
employees.addAll(Arrays.asList(new Employee("Jane"), new Employee("Joe"), etc);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论