如何从arraylist中删除元素?

时间:2015-12-01 21:22:56

标签: java arraylist

对于我的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;
}
}

3 个答案:

答案 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