所以我想知道是否有更有效的方法在java中执行此操作?假设对象的名单目前居住...从列表中删除具有空属性的对象的最有效方法
for (Object obj : objects) {
if (obj.getAttribute() == null) {
objects.remove(obj);
}
}
从本质上讲,我只是希望能够从给定的列表中删除任何对象,如果在该列表中的对象包含特定的空属性。思考?
所以我想知道是否有更有效的方法在java中执行此操作?假设对象的名单目前居住...从列表中删除具有空属性的对象的最有效方法
for (Object obj : objects) {
if (obj.getAttribute() == null) {
objects.remove(obj);
}
}
从本质上讲,我只是希望能够从给定的列表中删除任何对象,如果在该列表中的对象包含特定的空属性。思考?
在Java 8:
objects.removeIf(o -> o.getAttribute() == null);
在之前的版本:
for (Iterator<MyObject> it = objects.iterator(); it.hasNext();) {
if (it.next().getAttribute() == null)
it.remove();
}
另见Removing items from a collection in java while iterating over it。 (该for
循环,你已经证明可以抛出ConcurrentModificationException
。)
这两个是更高效,因为它们允许在收集到做他们想要的方式迭代和删除,不过我还是要说的除非你有一个巨大的收藏,并且做了很多事情,否则我认为这不是重要的。
作为一个例子,这些问题可能会变得更好,问题显示的代码对于链表(类似O(n2/2)
,对于最糟糕的情况,我认为)的时间复杂性较差,因为objects.remove
的调用需要另一次遍历。使用Iterator
可让列表在不进行遍历的情况下执行删除操作。
但是,使用Iterator
对ArrayList
仍然很差,因为元素每次都会发生移位。 Java 8版本是最好的。 ArrayList
uses a BitSet
并且一次完成全部移动。
啊,甚至没有想到抛出异常。不幸的是,我正在一个我们目前不使用Java 8的环境中工作,所以使用迭代器的后一个选项是我必须使用的。但是我会在后面保留'removeIf',以防我们决定在这里升级我们的java版本。感谢您的帮助! –
迭代器很丑陋。 :) – Radiodef
您无法以您编写代码的方式删除对象,而无法引入ConcurrentModificationException。 –