2011-12-15 4 views
13

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

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>

ответ

20

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; 
} 
7

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

В данном конкретном случае: добавьте метод equals(Object) к вашему классу ArrayTest. Это позволит ArrayList.remove(Object) идентифицировать правильный объект.

0
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); 

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

+0

но как я могу получить объект ArrayTest такой же, как предыдущий ......... – sanu

0

использовать этот код

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. 
+0

если там положение нерегулярно, то как я могу получить индекс obj. – sanu

+0

простите меня, если я не понимаю вашей точки. но вам не нужно указывать индекс, вам нужно передать объект методу indexOf, и он вернет индекс объекта, а метод remove удалит этот индекс из ArrayList. Если у вас есть повторяющиеся объекты с одинаковым значением, вам нужно реализовать метод equals в своем классе. –

+0

, но в этом случае IndexOf (OBJ) сохраняет значение индекса последнего объекта, ArrayTest (3) ..... так что это будет удалить последний объект – sanu

0

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

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; 
    } 

} 

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

+0

Что делать, если вы хотите удалить несколько объектов, соответствующих свойству? – tmh

0

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

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

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

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

0

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

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

вместо

theDeck.remove(numberNeededRemoved); 

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

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

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

0

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

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

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

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

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

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

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

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