2015-05-06 84 views
1

所以我想知道是否有更有效的方法在java中执行此操作?假设对象的名单目前居住...从列表中删除具有空属性的对象的最有效方法

for (Object obj : objects) { 
    if (obj.getAttribute() == null) { 
     objects.remove(obj); 
    } 
} 

从本质上讲,我只是希望能够从给定的列表中删除任何对象,如果在该列表中的对象包含特定的空属性。思考?

+1

您无法以您编写代码的方式删除对象,而无法引入ConcurrentModificationException。 –

回答

2

在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可让列表在不进行遍历的情况下执行删除操作。

但是,使用IteratorArrayList仍然很差,因为元素每次都会发生移位。 Java 8版本是最好的。 ArrayList uses a BitSet并且一次完成全部移动。

+1

啊,甚至没有想到抛出异常。不幸的是,我正在一个我们目前不使用Java 8的环境中工作,所以使用迭代器的后一个选项是我必须使用的。但是我会在后面保留'removeIf',以防我们决定在这里升级我们的java版本。感谢您的帮助! –

+1

迭代器很丑陋。 :) – Radiodef

相关问题