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

时间:2016-03-16 07:15:16

标签: java loops object arraylist

我正在维护一个ArrayList个对象。我的对象结构是Id,名称,其他一些细节。我需要删除一个具有一些id值的对象(10)并且我不想迭代列表。对此有什么解决方案吗?

5 个答案:

答案 0 :(得分:17)

使用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方法中,它只是在内部执行。

答案 1 :(得分:1)

也许我不明白这个问题,但是为什么没有人建议对该用户类使用覆盖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 "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 :(得分:0)

如果没有迭代器,你就不能这样做,你应该为此做Hashmap。

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

生成所有的setter和getter。

中使用此课程
Hashmap<Integer, ObjectStructure> data = new HashMap<>();

您只能使用Integer键来添加和删除数据。

data.remove(10);

答案 3 :(得分:0)

如果你真的不想迭代列表,你可以使用一个流,但我个人更喜欢像@TagirValeev建议的Collection#removeIf

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

答案 4 :(得分:0)

如果不以某种形式迭代列表,则无法从ArrayList中删除元素的所有实例。 ArrayList是一个数组,你需要检查数组中的每个元素,看它是否符合删除标准。在基础层面,需要循环...迭代元素。

另请注意,从阵列中删除单个元素时,需要移动在删除元素后面具有位置的所有元素。平均而言,这将是数组元素的一半。

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

相关问题