从具有某些对象属性的ArrayList中删除对象

14

我正在维护一个对象的ArrayList。我的对象结构是Id、名称和一些其他细节。我需要删除一个具有某个id值(比如10)的对象,而且我不想迭代整个列表。是否有任何解决方案?

我正在维护一个包含多个对象的ArrayList。每个对象都由 Id、名称和其他一些细节组成。我需要从列表中删除一个指定 id(例如 10)的对象,但我不想对整个列表进行迭代。是否有任何解决方法?
5个回答

63

使用Java-8 Collection#removeIf

myList.removeIf(obj -> obj.id == 10);

使用Java-7,您必须使用迭代器:

for(Iterator<MyType> iterator = myList.iterator(); iterator.hasNext(); ) {
    if(iterator.next().id == 10)
        iterator.remove();
}

请注意,无论如何都需要进行列表迭代。在Java-8中,removeIf方法只是在内部执行。


@Tagir Valeev 非常感谢您的有效回复。有没有不需要迭代的方法? - django
@django 请检查Java-8的可行性。 - Yassin Hajaj
这两种方法都涉及对列表进行迭代。 - pvg
@Tagir Valeev,是的,它正在运行。我还有一个疑问,我需要获取id=10的那个对象,而不是删除它。我该怎么办? - django

3
也许我没有理解问题,但为什么没有人建议在该用户类中使用覆盖equals和hashcode呢?
class MyObject {
    final String id;
    final String name;

    MyObject(String id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        return Objects.equals(id, ((MyObject) o).id);
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }

    @Override
    public String toString() {
        return "MyObject{id='" + id + "', name='" + name + "'}";
    }
}

在这种情况下,您可以轻松地从列表中删除任何对象。
        final ArrayList<MyObject> list = new ArrayList<>();
        list.add(new MyObject("id1", "name1"));
        list.add(new MyObject("id2", "name2"));
        list.add(new MyObject("id3", "name3"));

        MyObject removeCandidate = new MyObject("id2", "name2");

        list.remove(removeCandidate);
        System.out.println(list);

以上代码输出

[MyObject{id='id1', name='name1'}, MyObject{id='id3', name='name3'}]

2
如果你真的不想遍历列表,可以使用流,但我个人更喜欢像@TagirValeev建议的Collection#removeIf
myList = myList.stream()
               .filter(x -> x.id() != 10)
               .collect(Collectors.toList());

1
无法从ArrayList中删除元素实例而不以某种方式迭代列表。 ArrayList在底层是一个数组,您需要检查数组中的每个元素,以查看它是否符合删除的条件。在基本级别上,这需要循环...来迭代元素。
还要注意,当您从数组中删除单个元素时,所有位置在被删除元素之后的元素都需要移动。平均而言,这将是数组元素的一半。
现在,您可以编写避免使用显式for循环的代码,但无论如何编写代码,迭代都将在幕后发生。

1 - 这并不完全正确。假设你有一个单独的数据结构,将值映射到ArrayList中元素的索引(例如),那么你可以在不迭代的情况下删除元素。但我无法想象如何有效地管理这个数据结构。

2 - 迭代不仅意味着使用Iterator。循环,StreamCollections.removeIf和其他解决方案都需要在幕后迭代列表的元素。


0

没有迭代器是做不到的,你应该使用 Hashmap。

public class ObjectStructure{
private int Id;
private String name;
//and any data field you need
}

生成所有的设置器和获取器。
在这个类中使用。
Hashmap<Integer, ObjectStructure> data = new HashMap<>();

您可以仅使用整数键添加和删除数据。

data.remove(10);


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