所以我想知道是否有更有效的方法在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。 –