2015-05-06 83 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

相關問題