Как удалить конкретный объект из ArrayList в Java?

Как удалить конкретный объект из ArrayList? Предположим у меня есть класс, как показано ниже:

import java.util.ArrayList;    
public class ArrayTest {
    int i;

    public static void main(String args[]){
        ArrayList<ArrayTest> test=new ArrayList<ArrayTest>();
        ArrayTest obj;
        obj=new ArrayTest(1);
        test.add(obj);
        obj=new ArrayTest(2);
        test.add(obj);
        obj=new ArrayTest(3);
        test.add(obj);
    }
    public ArrayTest(int i){
        this.i=i;
    }
}

как я могу удалить объект с new ArrayTest(1) от меня ArrayList<ArrayList>

12 ответов


ArrayList удаляет объекты на основании equals(Object obj) метод. Поэтому вы должны правильно реализовать этот метод. Что-то вроде:

public boolean equals(Object obj) {
    if (obj == null) return false;
    if (obj == this) return true;
    if (!(obj instanceof ArrayTest)) return false;
    ArrayTest o = (ArrayTest) obj;
    return o.i == this.i;
}

в общем случае объект может быть удален двумя способами из ArrayList (или вообще любой List), по индексу (remove(int)) и объекта (remove(Object)).

в этом конкретном сценарии: добавьте equals(Object) метод ArrayTest класса. Что позволит ArrayList.remove(Object) определить правильный объект.


для удаления конкретного объекта из arrayList существует два способа. Вызовите функцию arrayList.

  1. удаление на основе объекта.
arrayList.remove(object);

это удалит ваш объект, но в большинстве случаев, когда arrayList содержит элементы типов данных UserDefined, этот метод не дает вам правильного результата. Это работает только для примитивных типов данных. Поскольку пользователь хочет удалить элемент на основе значения поля объекта, и это может не сравнивайте функцией remove автоматически.

  1. удаление на основе указанной позиции индекса arrayList. Лучший способ удалить любой элемент или объект из arrayList. Во-первых, найти индекс элемента, который вы хотите удалить. Затем вызовите этот метод arrayList, этот метод удаляет элемент на основе индекса. И это даст правильный результат.
arrayList.remove(index);  

Если вы используете Java 8:

test.removeIf(t -> t.i == 1);

Java 8 имеет removeIf метод в интерфейсе коллекции. Для ArrayList он имеет расширенную реализацию (порядок n).


Авальчев прав. Более быстрым решением было бы проанализировать все элементы и сравнить по уникальному свойству.

String property = "property to delete";

for(int j = 0; j < i.size(); j++)
{
    Student obj = i.get(j);

    if(obj.getProperty().equals(property)){
       //found, delete.
        i.remove(j);
        break;
    }

}

это быстрое решение. Вам лучше реализовать сравнение объектов для более крупных проектов.


используйте этот код

test.remove(test.indexOf(obj));

test is your ArrayList and obj is the Object, first you find the index of obj in ArrayList and then you remove it from the ArrayList.

    ArrayTest obj=new ArrayTest(1);
    test.add(obj);
    ArrayTest obj1=new ArrayTest(2);
    test.add(obj1);
    ArrayTest obj2=new ArrayTest(3);
    test.add(obj2);

    test.remove(object of ArrayTest);

вы можете указать, как вы управляете каждым объектом.


вы можете использовать коллекции.binarySearch, чтобы найти элемент, затем вызовите remove по возвращаемому индексу.

см. документацию для коллекций.ищет здесь: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#binarySearch%28java.util.List,%20java.lang.Object%29

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

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


это помогло мне:

        card temperaryCardFour = theDeck.get(theDeck.size() - 1);
        theDeck.remove(temperaryCardFour);    

вместо

theDeck.remove(numberNeededRemoved);

Я получил конформацию удаления на первом фрагменте кода и конформацию удаления ООН на втором.

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

Натан Нельсон


если вы хотите удалить несколько объектов, которые соответствуют свойству попробовать это.

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

в общем случае объект может быть удален двумя способами из ArrayList (или вообще любой список), by index (удалить (int)) и по object (удалить(объект)).

на arrayList.remove(index)или arrayList.remove(obj.get(index)) С помощью этих линий может не работать, попробуйте использовать следующий код.

for (Iterator<DetailInbox> iter = detailInboxArray.iterator(); iter.hasNext(); ) {
    DetailInbox element = iter.next();
   if (element.isSelected()) {
      iter.remove();
   }
}

List<Object> list = new ArrayList();
for (Iterator<Object> iterator = list.iterator(); iterator.hasNext();) {
  Object obj= iterator.next();
    if (obj.getId().equals("1")) {
       // Remove the current element from the iterator and the list.
       iterator.remove();
    }
}

вот полный пример. мы должны использовать удаление итератора () метод

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayTest {
    int i;
    public static void main(String args[]) {
        ArrayList<ArrayTest> test = new ArrayList<ArrayTest>();
        ArrayTest obj;
        obj = new ArrayTest(1);
        test.add(obj);
        obj = new ArrayTest(2);
        test.add(obj);
        obj = new ArrayTest(3);
        test.add(obj);
        System.out.println("Before removing size is " + test.size() + " And Element are : " + test);
        Iterator<ArrayTest> itr = test.iterator();
        while (itr.hasNext()) {
            ArrayTest number = itr.next();
            if (number.i == 1) {
                itr.remove();
            }
        }
        System.out.println("After removing size is " + test.size() + " And Element are :" + test);
    }
    public ArrayTest(int i) {
        this.i = i;
    }
    @Override
    public String toString() {
        return "ArrayTest [i=" + i + "]";
    }

}

Working demo Screen