Tôi có một ArrayList để lưu trữ một số dữ liệu, nhưng bất cứ khi nào tôi loại bỏ một mục khỏi danh sách, kích thước không giảm, ngay cả khi tôi gọi ArrayList.trimToSize() . Điều này gây ra cho tôi nullPointerExceptions.Java ArrayList.remove() không giảm kích thước của ArrayList
Làm cách nào tôi có thể xóa một mục khỏi ArrayList và có kích thước của danh sách() thu nhỏ cho phù hợp?
EDIT: Được rồi, đây là mã. Đây là một chút nền bạn cần phải biết, vì tôi không thể đăng tất cả các mã. Tôi có một ArrayList gọi là _dataHeap và một HashMap gọi là _dataMap. ArrayList là một Heap nhị phân có chứa một đối tượng "có thể tìm thấy", có một khóa. HashMap liên kết từ một khóa tới chỉ mục của đối tượng trong ArrayList. Đây là một mục trong hàng đợi có thể được tìm thấy theo mục bằng cách sử dụng HashMap hoặc bằng chỉ mục sử dụng ArrayList. Khóa có thể là bất kỳ đối tượng nào, miễn là nó là duy nhất cho mọi mục trong hàng đợi.
Tôi đã sửa lỗi dòng này theo dòng và Heap chứa đối tượng, ngay cả xuống mã băm. Vấn đề là, Object không bao giờ bị xóa khỏi ArrayList. Điều này phải có nghĩa là _dataMap.get (element.getKey()) không trỏ đến vị trí cần thiết. Tôi đã kiểm tra nó mặc dù, tôi đã sử dụng một đối tượng thử nghiệm bên ngoài thực hiện của tôi mà bản đồ từ một String đến một đối tượng tùy chỉnh với String là một khóa.
Tôi tạo một đối tượng, với chuỗi "một" làm khóa của nó. Tôi chèn nó, sau đó cố gắng loại bỏ nó. Tôi đã bước qua điều này, và tất cả mọi thứ kiểm tra, ngoại trừ một điều: Các đối tượng không bao giờ được gỡ bỏ từ hàng đợi. Nó có cùng một Hashcode, cùng Key, mọi thứ. Nó được loại bỏ khỏi bản đồ tốt, nhưng không phải từ ArrayList.
Dưới đây là phương pháp loại bỏ:
public T remove(T element) {
//We'll need this data to return the proper value
T t = _dataHeap.get(_dataMap.get(element.getKey()));
/*
* this Swap() call is used to swap our target with the end
* of the arraylist. This means that whenever we remove it,
* we don't have a change in indexes of the other nodes.
* After that, we downHeapify() to fix the whole graph back
* to it's functional state.
*/
swap(_dataMap.get(element.getKey()),length()-1);
//Remove from the Heap
_dataHeap.remove(_dataMap.get(element.getKey()));
_dataHeap.trimToSize();
//Remove from the Map
_dataMap.remove(element.getKey());
downHeapify();
return t;
Tôi hy vọng điều này mang đến cho bạn một ý tưởng tốt hơn về những gì tôi đang làm sai.
EDIT THE SECOND: Holy crap Cuối cùng tôi đã sửa nó! Tôi đã kéo _dataHeap.get (element.index) vào biến riêng của nó. Điều đó giải quyết mọi thứ!
Bạn có thể đăng mã bạn đang sử dụng không? – highlycaffeinated
Bạn không cần phải gọi 'trimToSize()' và 'remove()' _should_ cập nhật đúng kích thước của danh sách. Có lẽ bạn có thể đăng một [SSCCE] (http://sscce.org/) để minh họa vấn đề? –