2015-12-01 7 views
2

Для моего метода DeleteTask, я хочу, чтобы иметь возможность удалять задачи, которые помечены как завершенные, но мне было дано с этой ошибкой:Как удалить элементы из arraylist?

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

'индекс ArrayList' начинается с 0. Таким образом, если вы хотите, чтобы удалить первый (и только), вы удаляете элемент в позиции 0. –

+0

, когда вы вызываете deleteTask (int deleteId)? проверить 'deletedId'? может быть, он превышает фактический размер –

ответ

0

Начало newTaskID в 0 вместо 1 ...

public TaskManager(){ 
    tasks = new ArrayList<Task>(); 
    nextTaskId = 0; 
} 

Массивы в Java являются 0 на основе так первый элемент массива имеет индекс 0.

проблема с вашим логика, однако, если вы удалите элемент, то индексы элементов после удаления элемента будут изменены. Вам необходимо либо обновить идентификаторы для элементов после удаляемого элемента, либо изменить способ удаления. Вы можете найти элемент в списке с идентификатором соответствия, а затем удалить этот элемент из найденного индекса.

0

В Java индексы массива начинаются с 0, а не 1. Таким образом, чтобы получить единственный элемент в массиве с 1 элементом, вы должны сказать task.get (0), а не tasks.get (1).

0

Индексы в ArrayList равны нулю основе (то же самое для обычных массивов в Java), так как инициализировать ваш идентификатор с 0:

nextTaskId = 0; 

внутри конструктора или вычесть 1 из идентификатора при удалении задачи из списка:

return tasks.remove(deleteId-1); 

Ваша логика будет работать до тех пор, пока вы не удалите какую-либо задачу. Тогда ваши идентификаторы будут больше размера списка. Я думаю, что было бы лучше использовать

return tasks.remove(findById(completedId)); 

Когда вы не знаете, как некоторый класс или конкретный метод работает всегда Reffer в docs

Смежные вопросы