【发布时间】:2016-07-01 22:31:22
【问题描述】:
我正在维护一个ArrayList 对象。我的对象结构是 ID、名称和其他一些细节。我需要删除一个具有某些 id 值 say(10) 的对象,并且我不想遍历列表。有什么解决办法吗?
【问题讨论】:
标签: java loops object arraylist
我正在维护一个ArrayList 对象。我的对象结构是 ID、名称和其他一些细节。我需要删除一个具有某些 id 值 say(10) 的对象,并且我不想遍历列表。有什么解决办法吗?
【问题讨论】:
标签: java loops object arraylist
使用 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 方法中,它只是在内部执行。
【讨论】:
也许我不明白这个问题,但为什么没有人建议为该用户类使用覆盖 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'}]
【讨论】:
如果您真的不想遍历列表,可以使用流,但我个人更喜欢 Collection#removeIf,就像 @TagirValeev 建议的那样
myList = myList.stream()
.filter(x -> x.id() != 10)
.collect(Collectors.toList());
【讨论】:
如果不以某种方式迭代列表,则不可能1从ArrayList 中删除元素的实例2。 ArrayList 是一个底层数组,您需要检查数组中的每个元素以查看它是否符合删除标准。从根本上讲,这需要一个循环......来迭代元素。
另外请注意,当您从数组中删除单个元素时,所有位置在被删除元素之后的元素都需要移动。平均而言,这将是数组元素的一半。
现在,您可以通过避免使用显式 for 循环的方式对这些操作进行编码,但无论您如何编码,迭代都将在幕后进行。
1 - 不完全正确。假设您有一个单独的数据结构(例如)将值映射到ArrayList 中元素的索引,那么您可以在不迭代的情况下删除这些元素。但我看不出您如何有效地管理该数据结构。
2 - 迭代不仅仅意味着使用Iterator。对于循环,Stream、Collections.removeIf 和其他解决方案都需要在底层迭代列表的元素。
【讨论】:
如果没有迭代器,您将无法做到这一点,您应该为此使用 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);
【讨论】: