#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 () для поддержания контракта ) для сравнения объекта.