[英]Java ArrayList.remove() not decrementing the Size of the ArrayList
我有一個ArrayList來存儲一些數據,但每當我從列表中刪除一個項目時,即使我調用ArrayList.trimToSize(),大小也不會減少。 這導致我nullPointerExceptions。
如何從ArrayList中刪除單個項目並使列表的size()相應縮小?
編輯:好的,這是代碼。 這里有一些你需要知道的背景知識,因為我無法發布所有代碼。 我有一個名為_dataHeap的ArrayList和一個名為_dataMap的HashMap。 ArrayList是一個二進制Heap,包含一個“findable”對象,它有一個Key。 HashMap從Key綁定到ArrayList中對象的索引。 這樣就可以通過使用HashMap的項目或使用ArrayList的索引找到隊列中的項目。 Key可以是任何Object,只要它對隊列中的每個項都是唯一的。
我逐行調試了這個,而Heap包含了對象,甚至包含Hashcode。 問題是,Object永遠不會從ArrayList中刪除。 這必須意味着_dataMap.get(element.getKey())沒有指向它應該的位置。 我已經檢查了它,我在我的實現之外使用了一個測試對象,它從String映射到一個自定義對象,String作為鍵。
我創建了一個對象,字符串“one”作為其鍵。 我插入它,然后嘗試刪除它。 我已經逐步完成了這一切,所有內容都會檢出,除了一件事:對象永遠不會從隊列中刪除。 它有相同的Hashcode,相同的Key,一切。 它很好地從地圖中刪除,但不是從ArrayList中刪除。
這是刪除方法:
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;
我希望這可以讓你更好地了解我做錯了什么。
編輯第二篇:神聖的廢話我終於解決了! 我將_dataHeap.get(element.index)拉入其自己的變量中。 這解決了一切!
正如Bemace所說,檢查刪除是否按預期工作。 我敢打賭,你正在編寫的對象上的equals()方法不能按照你期望的方式工作,因為你沒有覆蓋它。
此外,在重寫equals之后,請注意也要覆蓋hashCode。 當您的對象無法使用HashMaps時,它會為您節省一些問題。 :)
提示:查看使用JUnit 。 它會把這些小錯誤從水中吹出來,當你的某些東西不能正常工作時,你就會明白這一點。 很難忽視你漂亮的綠色酒吧上的鮮紅色斑點。
聽起來像你實際上並沒有刪除任何東西。 remove
電話的返回值是多少?
如果您正在使用remove(int)
則返回值應為非null。 如果使用remove(Object)
,則結果應為true。 否則你實際上沒有刪除任何東西。 嘗試刪除不存在的元素不是錯誤,只返回null或false 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.