2010-10-22 37 views
6

Tôi là một lập trình viên Java tương đối mới và tôi đang loại bỏ difficuly nhiều hơn một phần tử từ một ArrayList. Lý tưởng nhất là tôi muốn làm một cái gì đó như thế này:Làm cách nào để xóa các phần tử tuần tự khỏi một ArrayList Java?

ArrayList ar1 = new ArrayList(); 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 

for (int i = 0; i < 2; i++){ 
    ar1.remove(i); 
} 

Tôi nghĩ rằng trình vòng lặp có thể giúp ích, nhưng tôi không thể tìm thấy ví dụ phù hợp với đủ những gì tôi đang cố gắng làm. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.

Trả lời

20

Dưới đây là những gì bạn muốn làm:

ar1.subList(0, 2).clear(); 

Điều này tạo ra một cái nhìn sublist của 2 yếu tố đầu tiên của danh sách và sau đó xóa mà sublist, loại bỏ chúng ra khỏi danh sách ban đầu. Phương pháp subList tồn tại chủ yếu cho loại điều này ...hoạt động trên một phạm vi cụ thể của danh sách.

+0

+1 câu trả lời xuất sắc. – aioobe

+0

+1 Đó là những gì các tài liệu API đề xuất bạn làm. (Có thể thường không hiệu quả như nhiều cuộc gọi 'remove'.) –

+0

Trừ khi các mục OP muốn xóa không tuần tự. Phụ thuộc vào các chi tiết. –

2

Bạn có thể sử dụng Collection.removeAll (toRemove) nếu bạn có một danh sách các đối tượng riêng biệt cần xóa.

http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Nếu bộ sưu tập của bạn được lập chỉ mục dựa, như ArrayList là, bạn có thể gọi

remove(index) 

để loại bỏ phần tử tại chỉ số. Bạn có thể làm điều đó trong một vòng lặp, nhưng hãy cẩn thận rằng loại bỏ tất cả các chỉ mục như một câu trả lời chỉ ra.

Nếu tất cả các bạn muốn làm là loại bỏ hai yếu tố đầu tiên trong danh sách, sau đó

list.remove(0); 
    list.remove(0); 

nên làm điều đó.

+0

sai lầm của tôi, tôi đọc quá nhanh và nghĩ rằng ông đã cố gắng để ngăn chặn các mục trùng lặp. removeAll vẫn trên giết trong trường hợp này – Woot4Moo

+0

Nhưng 'removeAll' sẽ loại bỏ ** tất cả các lần xuất hiện ** của các phần tử chứa trong đối số, từ callee, nghĩa là, nó không giống như loại bỏ phần tử đầu tiên thành các phần tử của ArrayList . – aioobe

+0

@ vâng, bạn nói đúng. – hvgotcodes

5

Bạn chắc chắn có thể làm điều đó

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    for (int i = 0; i < 2; i++) { 
     ar1.remove(i); 
    } 
    System.out.println(ar1); 

Chỉ chú ý rằng sau khi bạn loại bỏ phần tử đầu tiên, các yếu tố khác thay đổi. Do đó, gọi số

ar1.remove(0); 
ar1.remove(1); 

sẽ loại bỏ hiệu quả phần tử thứ nhất và thứ ba khỏi danh sách. Việc này sẽ xoá hai yếu tố đầu tiên, mặc dù:

ar1.remove(0); 
ar1.remove(0); 
+0

Cách này phụ thuộc vào loại điều được lưu trữ trong danh sách? –

+0

@Stephen Của tôi xấu, tôi bối rối mọi thứ. –

3

Để xóa vĩnh viễn được lập chỉ mục từ một danh sách, bạn cần phải đếm ngược:

for (int i = 1; i >= 0; i--) 

khác, loại bỏ đầu tiên bạn thay đổi các mặt hàng "ở trên" nó trong bộ sưu tập và bạn không loại bỏ các mục mà bạn cho rằng bạn đang xóa.

1

Bạn có thể thử này:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
int i = 0; 
while (i < 2 && it.hasNext()) { 
    it.next(); 
    it.remove(); 
    i++; 
} 

Hoặc, tổng quát hơn:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
while (it.hasNext()) { 
    Whatever next = it.next(); 
    if (shouldRemove(next)) { 
     it.remove(); 
    } 
} 

EDIT: Tôi đoán nó phụ thuộc nếu bạn đang cố gắng để loại bỏ các chỉ số cụ thể hoặc đối tượng cụ thể. Nó cũng phụ thuộc vào bao nhiêu logic bạn cần phải quyết định nếu một cái gì đó cần được loại bỏ. Nếu bạn biết các chỉ mục sau đó loại bỏ chúng theo thứ tự ngược lại. Nếu bạn có một bộ đối tượng cần xóa, thì hãy sử dụng removeAll. Nếu bạn muốn lặp qua danh sách và loại bỏ các đối tượng khớp với một vị từ, sau đó sử dụng mã trên.

+1

Ah, vâng. Cảm ơn, Erick. StackOverflow thực sự cần một trình biên dịch được xây dựng trong khung câu trả lời để chúng tôi có thể kiểm tra mã của chúng tôi :) –

2

Nếu bạn biết các chỉ số của các mục mà bạn muốn loại bỏ, bạn có thể xóa chúng theo thứ tự ngược lại, mà không lo lắng về chuyển chỉ số:

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    int[] indexesToRemove = {0,2,3}; 
    Arrays.sort(indexesToRemove); 
    for (int i=indexesToRemove.length-1; i>=0; i--) { 
     ar1.remove(indexesToRemove[i]); 
    } 
Các vấn đề liên quan