簡體   English   中英

Java ArrayList.remove()不會減小ArrayList的大小

[英]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。 否則你實際上沒有刪除任何東西。 嘗試刪除不存在的元素不是錯誤,只返回nullfalse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM