2013-09-02 31 views
6

Như hình minh họa, sau khi chạy một phương pháp, tôi muốn xóa các mục cũ và chuẩn bị cho lần tính toán tiếp theo, nhưng tôi tự hỏi làm thế nào để loại bỏ các phần tử trong một arraylist bắt đầu từ một chỉ số được chỉ định, giống như một hàng đợi, tuân theo thuật toán FIFO? q1Cách xóa các phần tử trong danh sách mảng bắt đầu từ chỉ mục được chỉ định

+0

@Katona :) tôi đi để đọc điều đó, hy vọng có thể tìm thấy một giải pháp – atom2ueki

+0

trong khi chờ đợi, tôi quản lý một câu trả lời ngắn cũng như – Katona

Trả lời

11

Bạn có thể sử dụng List#subList(int, int):

List<Integer> list = ... 
list = list.subList(10, list.size()); // creates a new list from the old starting from the 10th element 

hay, kể từ khi subList tạo ra một cái nhìn mà mỗi thay đổi ảnh hưởng đến danh sách ban đầu, đây có thể thậm chí tốt hơn:

List<Integer> list = ... 
list.subList(0, 10).clear(); // clears the first 10 elements of list 
+0

Khi tôi sử dụng "purchase = (ArrayList ) purchase.subList (index, purchase.size());" cung cấp cho tôi một lỗi ngoại lệ..java.lang.ClassCastException: java.util.RandomAccessSubList không thể được đưa vào java.util.ArrayList – atom2ueki

+0

Logic là chính xác, nhưng chỉ đến với lỗi – atom2ueki

+0

@ atom2ueki không sử dụng 'ArrayList' làm kiểu biến, sử dụng 'danh sách' như tôi đã làm với' danh sách' trong câu trả lời của tôi – Katona

1

Chỉ cần sử dụng phương pháp remove() cho việc này.

Giả sử bạn muốn loại bỏ các yếu tố với chỉ số 20-30 của một ArrayList:

ArrayList<String> list = ... 
for (int i = 0; i < 10; i++) { // 30 - 20 = 10 
    list.remove(20); 
} 

Khi phần tử đầu tiên tại index 20 được lấy ra yếu tố 21 di chuyển đến chỉ số 20. Vì vậy, bạn phải xóa 10 lần phần tử tại chỉ mục 20 để xóa 10 phần tử tiếp theo.

+0

phương pháp của bạn dường như chỉ xóa phần tử thứ 20 – atom2ueki

+0

Bạn đã đọc câu bên dưới mã chưa? Không có "lỗ hổng" trong một danh sách mảng. Nếu bạn loại bỏ phần tử với chỉ mục 20 thì phần tử tiếp theo sẽ chuyển sang chỉ mục này. – micha

+0

Tôi nghĩ rằng sẽ dễ dàng hơn nếu bạn có thể lặp lại từ 30 đến 20. Và sử dụng 'list.remove (i)' – mike

0

Vì bạn đang viết không có ứng dụng hiệu suất cao, đó là kiểu xấu để lưu trữ nhiều ngữ nghĩa trong một biến chỉ mục.

Cách tiếp cận tốt hơn sẽ là sử dụng bản đồ.

E. g. Map<Item, Integer> itemStockMap<Item, Double> prices. Bạn sau đó cũng sẽ không có bất kỳ vấn đề với các hoạt động loại bỏ.

+0

nhưng nếu sử dụng bản đồ, tôi vẫn cần một số nhận dạng cho mỗi bản đồ, nó có giống với danh sách ở đây không? xin lỗi, tôi không hoàn toàn hiểu ý bạn là gì – atom2ueki

+1

Bản đồ không hoạt động với các chỉ mục, chúng hoạt động với các Phím. Các khóa là các đối tượng, đó là những gì ta sẽ làm trong OOP, nó dễ dàng hơn để duy trì mã với các mã định danh hơn là duy trì các mã trong đó các số nguyên có ý nghĩa vượt ra ngoài chỉ là một số. Bạn nên viết một lớp 'Item' hoặc sth. như vậy và sử dụng nó làm chìa khóa cho bản đồ. – mike

Các vấn đề liên quan