对于我的deleteTask方法,我希望能够删除标记为已完成的任务,但我已收到此错误:
java.lang.IndexOutOfBoundsException: Index:1, Size: 1 (in java.util.ArrayList).
任何人都可以帮助我吗?
import java.util.ArrayList;
public class TaskManager
{
private ArrayList<Task>tasks;
private int nextTaskId;
public TaskManager(){
tasks = new ArrayList<Task>();
nextTaskId = 1;
}
public int getCount(){
return tasks.size();
}
public String addTask(String description, int estimatedLength){
Task task1 = new Task(nextTaskId, description, estimatedLength);
tasks.add(task1);
boolean add = true;
if (tasks.contains(task1) == true){
nextTaskId++;
return "Task added.";
}else{
return "Error: not added.";
}
/*ArrayList<Task> tasks = new ArrayList<Task>();
for(int i = 0; i < tasks.size(); i++){
Task taskatm = new Task();
task.add(taskatm);
}
return "sq";*/
}
public Task findById(int ID){
int i = 0;
while(i < tasks.size()){
Task task = tasks.get(i);
i++;
if(task.getId() == ID){
return task;
}
}
return null;
}
public Task setCompleted(int completedId){
if(findById(completedId) != null){
findById(completedId).setDone();
return findById(completedId);
}
return null;
}
public Task deleteTask(int deleteId){
if(setCompleted(deleteId) != null){
return tasks.remove(deleteId);
}
return null;
}
}
答案 0 :(得分:0)
从0开始newTaskID
而不是1 ...
public TaskManager(){
tasks = new ArrayList<Task>();
nextTaskId = 0;
}
Java
中的数组基于0,因此数组中的第一个元素位于索引0处。
您的逻辑问题是,如果删除元素,则删除元素后元素的索引将发生变化。您需要更新已删除元素后元素的ID,或更改删除方式。您可以使用匹配的id搜索列表中的元素,然后从找到的索引中删除该元素。
答案 1 :(得分:0)
在Java中,数组索引从0开始,而不是1.因此,要获得具有1个元素的数组中的唯一元素,您可以说tasks.get(0)而不是tasks.get(1)。
答案 2 :(得分:0)
ArrayList中的索引从零开始(对于Java中的常规数组也是如此),因此要么将您的id初始化为0:
nextTaskId = 0;
在构造函数内部或从列表中删除任务时从id中减去1:
return tasks.remove(deleteId-1);
在您删除某项任务之前,您的逻辑将有效。然后你的ID将大于列表大小。我认为最好使用
return tasks.remove(findById(completedId));
如果您不确定某些课程或特定方法是如何工作的,请始终考虑docs