我正在维护一个对象的ArrayList
。我的对象结构是Id、名称和一些其他细节。我需要删除一个具有某个id值(比如10)的对象,而且我不想迭代整个列表。是否有任何解决方案?
ArrayList
。每个对象都由 Id、名称和其他一些细节组成。我需要从列表中删除一个指定 id(例如 10)的对象,但我不想对整个列表进行迭代。是否有任何解决方法?使用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
方法只是在内部执行。
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'}]
Collection#removeIf
。myList = myList.stream()
.filter(x -> x.id() != 10)
.collect(Collectors.toList());
1 - 这并不完全正确。假设你有一个单独的数据结构,将值映射到ArrayList
中元素的索引(例如),那么你可以在不迭代的情况下删除元素。但我无法想象如何有效地管理这个数据结构。
2 - 迭代不仅意味着使用Iterator
。循环,Stream
,Collections.removeIf
和其他解决方案都需要在幕后迭代列表的元素。
没有迭代器是做不到的,你应该使用 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);