Удалить объект из Arraylist Java, работающий только в определенных сценариях

#java #android-studio #arraylist

#java #android-studio #arraylist

Вопрос:

Я пытаюсь удалить объект из arraylist в java с помощью Android studio.

 public class ToDoListManager {

    private List<ToDoItem> items;

    public ToDoListManager() {
        items = new ArrayList<ToDoItem>();

        items.add(new ToDoItem("Get Milk", false));
        items.add(new ToDoItem("Walk the dog", true));
        items.add(new ToDoItem("Go to the gym", false));
    }

    public List<ToDoItem> getItems() {
        return items;
    }

    public void addItem(ToDoItem item) {
        items.add(item);
    }

    public void removeItem(ToDoItem item) {
       items.remove(item);
    }
}
 

Я вызывал функцию removeItem нажатием клавиши

Когда я добавляю, скажем, «test» в массив, он успешно добавляет его с помощью items.add(item) , однако, когда я пытаюсь items.remove(item) с той же строкой, это не сработает. Это работает, если я делаю items.remove(1) , но не если я делаю items.remove("test")

Как я мог это исправить? Я пробовал много разных способов. Спасибо.

Комментарии:

1. Вы не могли бы вызвать либо items.remove (1), либо items.remove («test») с помощью этого кода, поэтому вы не предоставляете точную информацию

Ответ №1:

Методы «удаления», реализованные в различных интерфейсах, составляющих ArrayList, принимают разные аргументы и делают очень разные вещи.

Если вы посмотрите на «Интерфейс списка», есть два метода

 public interface List<E> extends Collection<E> {
    ...

    // It removes from the position in the list so it's 
    // going to work if the list has more than "index" 
    // items. So when you call it with an integer this 
    // gets used and works.

    public E remove(int index) 

    ...
    // There is a second remove method in the interface

    // This Removes an object from the list if the object 
    // equals an object in the list. So when you pass it a 
    // string ie "test" this cannot work because "test" is 
    // not a ToDoItem so the equals comparison fails.

    boolean remove(Object o);
    ...
}
 

Если вы хотите использовать логическое удаление (Object o); метод, т.Е. Удалить объект, вам нужно убедиться, что метод «equals» будет работать в «TodoItem». Итак, как выглядит ваш метод equals в TodoItem?

Ответ №2:

Ваш items принимает только ToDoItem объекты.

Итак, items.remove("test") не сработает. Вот "test" строковый объект.

Но items.remove(1) будет работать, потому что здесь вы передаете index значение в качестве параметра remove() методу. Таким образом, объект из items указанного индекса будет удален.

Чтобы удалить указанный объект из items списка, вам необходимо передать ToDoItem объект в качестве параметра.

Подробнее: Как удалить элемент из ArrayList?

Примечание: Если вы хотите сравнить два ToDoItem объекта по значениям его элементов данных, переопределите метод equals в ToDoItem .

Комментарии:

1. Вместо этого я попытался передать его как объект, но он все равно не сработал. В итоге я изменил способ работы моей программы, спасибо!

2. Вы создаете новый объект и передаете его remove() методу? Если да, переопределили ли вы equals() метод в своем ToDoItem классе? Если вы создаете новый объект (даже с теми же значениями параметров) и передаете его методу arraylist remove, он не будет работать. Метод по умолчанию equals() сравнивает ссылку на объект на равенство.

3. Метод ArrayList remove использует это условие для удаления объекта. (o==null ? get(i)==null : o.equals(get(i))) Вам необходимо переопределить equals() метод (а затем метод hashcode () для поддержания контракта ) для сравнения объекта.