如何在Java中从ArrayList中删除特定对象?

33

如何从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;
    }
}

如何从我的ArrayList<ArrayList>中删除带有new ArrayTest(1)的对象


@Ripon\ @Sanu。尝试使用**Iterator remove();**方法。在迭代时从ArrayList中删除匹配的元素。 - Vipul Gulhane
17个回答

50

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;
}
或者
public boolean equals(Object obj) {
    if (obj instanceof ArrayTest) {
        ArrayTest o = (ArrayTest) obj;
        return o.i == this.i;
    }
    return false;
}

37

如果您使用的是Java 8或更高版本:

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

Java 8在集合接口中新增了一个removeIf方法。对于ArrayList,它有一个高级实现(n的顺序)。


20

6

要从ArrayList中删除特定的对象,有两种方法。调用arrayList的函数。

  1. 基于对象进行删除。
arrayList.remove(object);

这个方法可以移除你的对象,但是在大多数情况下,当ArrayList包含用户定义的数据类型时,这个方法不能给出正确的结果。它只能对原始数据类型起作用。因为用户想要根据对象字段值来删除项目,而这不能由remove函数自动比较。

  1. 基于指定索引位置从ArrayList中移除项目或对象的最佳方法。首先,找到您想要删除的项目的索引。然后调用此ArrayList方法,该方法将按索引删除项目。它将给出正确的结果。
arrayList.remove(index);  

6
这是一个完整的示例。我们必须使用迭代器的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


3
请使用以下代码:

使用此代码

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.

如果位置不规则,我该如何获取 obj 的索引? - sAaNu
抱歉,如果我没有理解您的观点。但是您不需要提供索引,您需要将对象传递给indexOf方法,它将返回对象索引,并且remove方法将从ArrayList中删除此索引。如果您有具有相同值的重复对象,则需要在类中实现equals方法。 - Kashif Khan
但在这种情况下,indexOf(obj)保留最后一个对象ArrayTest(3)的索引值.....因此它将删除最后一个对象。 - sAaNu
1
请使用以下代码:'public void deleteObject(ArrayTest obj) { for(int i=0; i<test.size();++i) if(test.get(i).i==obj.i) { test.remove(i); break; }}' - Kashif Khan

1
如果您想删除与属性匹配的多个对象,请尝试以下方法。
我使用了以下代码从对象数组中删除元素,它对我很有帮助。
一般来说,可以通过索引(remove(int))和对象(remove(Object))两种方式从ArrayList(或一般任何列表)中删除对象。
有时候,使用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();
   }
}

1
如果您想从ArrayList中删除或过滤特定对象,有许多方法可以使用,如下所示:
假设list是ArrayList的引用变量。
List<Student> list = ...;// Stored the objects here  

如果您知道要删除的特定学生对象,那么可以简单地使用它:
list.remove(student) //if you know the student object

如果您知道该学生的特定ID或名称,则可以使用Java 8 Collection.removeIf()方法:
list.removeIf(fandom -> id == fandom.getId());

你可以使用另一种方式,即Collectors.partitioningBy

Map<Boolean, List<Student>> studentsElements = list
.stream()
.collect(Collectors.partitioningBy((Student st) ->       
                  !name.equals(st.getName())));

// All Students who do have not that specific name
List<Student> matching = studentsElements.get(true));
// All Student who has only that specific name
List<Student> nonMatching = studentsElements.get(false));

或者你可以直接过滤那个特定的对象

List<Student> studentsElements = list
.stream()
.filter(e -> !name.equals(st.getName()))
.collect(Collectors.toList());

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

}

这是一个快速解决方案。对于更大的项目,最好实现对象比较。


如果您想删除与属性匹配的多个对象,该怎么办? - Tmh

1
我已经尝试过这个方法,对我有效:

ArrayList<cartItem> cartItems= new ArrayList<>();

//filling the cartItems

cartItem ci=new cartItem(itemcode,itemQuantity);//the one I want to remove

Iterator<cartItem> itr =cartItems.iterator();
while (itr.hasNext()){
   cartItem ci_itr=itr.next();
   if (ci_itr.getClass() == ci.getClass()){
      itr.remove();
      return;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接