2012-03-13 10 views
21

Tôi muốn xóa một đối tượng khỏi ArrayList khi tôi hoàn thành nó, nhưng tôi không thể tìm cách để làm điều đó. Cố gắng loại bỏ nó như trong mã mẫu dưới đây không muốn làm việc. Làm thế nào tôi có thể tới trình lặp của đối tượng px hiện tại trong vòng lặp này để loại bỏ nó?Xóa đối tượng khỏi ArrayList cho mỗi vòng

for(Pixel px : pixel){ 
[...] 
    if(px.y > gHeigh){ 
    pixel.remove(pixel.indexOf(px)); // here is the thing 
    pixel.remove(px); //doesn't work either 
    } 
} 
+1

thể trùng lặp của [Calling loại bỏ trong vòng lặp foreach trong Java] (http://stackoverflow.com/questions/1196586/calling-remove-in -foreach-loop-in-java) – DNA

+0

bản sao có thể có của [Iterating through a Collection, tránh ConcurrentModificationException khi loại bỏ trong vòng lặp] (http://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception -when-re) – omerhakanbilici

Trả lời

62

Bạn không thể, trong vòng lặp nâng cao. Bạn phải sử dụng "dài tay" cách tiếp cận:

for (Iterator<Pixel> iterator = pixels.iterator(); iterator.hasNext();) { 
    Pixel px = iterator.next(); 
    if(px.y > gHeigh){ 
    iterator.remove(); 
    } 
} 

Tất nhiên, không phải tất cả lặp hỗ trợ loại bỏ, nhưng bạn nên sử dụng tốt với ArrayList.

Cách khác là tạo thêm bộ sưu tập "pixel cần xóa" rồi gọi removeAll trong danh sách ở cuối.

1

sử dụng một vòng lặp for thường, tăng cường for vòng lặp duy trì một iterator, và không cho phép loại bỏ các đối tượng, hoặc sử dụng các iterator rõ ràng

Chỉnh sửa: xem câu trả lời của câu hỏi này Calling remove in foreach loop in Java

2

bạn cần để tạo và truy cập một cách rõ ràng iterator

Iterator<Pixel> it = pixel.iterator(); 
while(it.hasNext()){ 
Pixel.px = it.next(); 
//... 
it.remove(); 
} 
1

Bạn không thể sửa đổi một Bộ sưu tập khi ai đó đang lặp lại trên nó, thậm chí nếu ai đó là bạn. Sử dụng bình thường cho chu kỳ:

for(int i = 0; i < pixel.size(); i++){ 
    if(pixel.get(i).y > gHeigh){ 
     pixel.remove(i); 
     i--; 
    } 
} 
+0

bạn có vấn đề của vòng lặp tiếp theo cần phải được trên chỉ mục 'i' một lần nữa và bạn cần phải đảm bảo nó không được tăng lên –

+0

, cảm ơn bạn! –

0

Nếu Pixel là đối tượng tùy chỉnh của riêng bạn thì bạn cần triển khai phương thức equals và hashcode cho đối tượng Pixel của mình. Phương thức indexOf cũng tìm chỉ mục bằng phương thức equals. Hãy thử triển khai và kiểm tra nó.

23

Sử dụng lamdba expressions, phương pháp removeIf đã được giới thiệu cho bộ sưu tập.

Xóa tất cả các thành phần của bộ sưu tập này thỏa mãn thuộc tính nhất định.

Vì vậy, nó sẽ chỉ mất một dòng:

pixels.removeIf(px -> px.y > gHeigh); 
+0

bằng cách 'removeIf' sử dụng vòng lặp' Iterator' và 'while'. Bạn có thể thấy nó tại java 8 'java.util.Collection.java' – omerhakanbilici

+1

@omerhakanbilici Đây chỉ là thực hiện mặc định. Bạn có thể thấy nó đã được tối ưu hóa cho 'ArrayList's chẳng hạn. –