使用某些 Object 属性从 ArrayList 中删除对象

Posted

技术标签:

【中文标题】使用某些 Object 属性从 ArrayList 中删除对象【英文标题】:Remove object from ArrayList with some Object property 【发布时间】:2016-07-01 22:31:22 【问题描述】:

我正在维护一个ArrayList 对象。我的对象结构是 ID、名称和其他一些细节。我需要删除一个具有某些 id 值 say(10) 的对象,并且我不想遍历列表。有什么解决办法吗?

【问题讨论】:

【参考方案1】:

使用 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 检查 Java-8 的可能性。 这两个都涉及迭代列表。 @Tagir Valeev ..Ya 它正在工作。还有一个疑问,我需要获取 id=10 的对象,而不是删除。我该怎么办?【参考方案2】:

也许我不明白这个问题,但为什么没有人建议为该用户类使用覆盖 equalshashcode

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 "MyObjectid='" + 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);

打印上面的代码

[MyObjectid='id1', name='name1', MyObjectid='id3', name='name3']

【讨论】:

【参考方案3】:

如果您真的不想遍历列表,可以使用流,但我个人更喜欢 Collection#removeIf,就像 @TagirValeev 建议的那样

myList = myList.stream()
               .filter(x -> x.id() != 10)
               .collect(Collectors.toList());

【讨论】:

【参考方案4】:

如果不以某种方式迭代列表,则不可能1ArrayList 中删除元素的实例2ArrayList 是一个底层数组,您需要检查数组中的每个元素以查看它是否符合删除标准。从根本上讲,这需要一个循环......来迭代元素。

另外请注意,当您从数组中删除单个元素时,所有位置在被删除元素之后的元素都需要移动。平均而言,这将是数组元素的一半。

现在,您可以通过避免使用显式 for 循环的方式对这些操作进行编码,但无论您如何编码,迭代都将在幕后进行。


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

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

【讨论】:

【参考方案5】:

如果没有迭代器,您将无法做到这一点,您应该为此使用 Hashmap。

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

生成所有的 setter 和 getter。

中使用这个类
Hashmap<Integer, ObjectStructure> data = new HashMap<>();

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

data.remove(10);

【讨论】:

以上是关于使用某些 Object 属性从 ArrayList 中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

集合Arraylist

如何对ArrayList中的某个属性进行排序

从 ArrayList 中删除某些 TextView

ArrayList实现分组功能

Servlet ArrayList 到 JSP(从 Object 到 ArrayList 的未经检查的强制转换)

Java集合ArrayList源代码详细解析