我正在维护一个ArrayList
个对象。我的对象结构是Id,名称,其他一些细节。我需要删除一个具有一些id值的对象(10)并且我不想迭代列表。对此有什么解决方案吗?
答案 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)
也许我不明白这个问题,但是为什么没有人建议对该用户类使用覆盖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 :(得分: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
循环的方式对这些操作进行编码,但无论您如何编写代码,迭代都将在幕后进行。