繁体   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