Java ArrayList.remove() 不减少 ArrayList 的大小

标签 java arrays size arraylist

我有一个 ArrayList 来存储一些数据,但是每当我从列表中删除一个项目时,即使我调用 ArrayList.trimToSize() 时,大小也不会减少。这导致我出现 nullPointerExceptions。

如何从 ArrayList 中删除单个项目并使列表的 size() 相应缩小?

编辑:好的,这是代码。这是您需要了解的一些背景知识,因为我无法发布所有代码。我有一个名为_dataHeap 的ArrayList 和一个名为_dataMap 的HashMap。 ArrayList 是一个二进制堆,包含一个“可查找”对象,该对象具有一个键。 HashMap 从 Key 绑定(bind)到 ArrayList 中对象的索引。这样就可以使用 HashMap 按项目或使用 ArrayList 按索引找到队列中的项目。键可以是任何对象,只要它对于队列中的每个项目都是唯一的。

我已经逐行调试了,Heap 包含对象,甚至包括 Hashcode。问题是,对象永远不会从 ArrayList 中删除。这一定意味着 _dataMap.get(element.getKey()) 没有指向它应该指向的位置。不过,我已经检查过了,我在我的实现之外使用了一个测试对象,该对象从一个字符串映射到一个以字符串作为键的自定义对象。

我创建了一个对象,字符串“one”作为它的键。我插入它,然后尝试将其移除。我已经完成了这个,一切都检查出来了,除了一件事:该对象永远不会从队列中删除。它有相同的 Hashcode,相同的 Key,一切。它可以很好地从 map 中删除,但不会从 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。当您的对象不适用于 HashMap 时,它会为您省去一个 SO 问题。 :)

提示:考虑使用 JUnit .它会把这些小错误从水里吹出来,当某些事情没有按照您希望的方式工作时,您会很明显地看到这些错误。很难忽视美丽的绿色条上的鲜红色 Blob 。

关于Java ArrayList.remove() 不减少 ArrayList 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963652/

相关文章:

java - Procmail 配方,管道到 Java 标准输入

java - 字符串数组操作

swift - 如何更改 NSTableHeaderCell 的字体大小

java - 解决数组中的空元素

java - 尝试使用 getClassContext()[1].getName() 在 Android 上获取类名

java - jdk中String类的indexOf方法是使用BF实现的,为什么不使用KMP或BM呢?

c - C 中使用指针对数组进行排序时遇到的问题

javascript - 在javascript中转换为分层数组

java - 永久增加java堆大小?

cocoa - NSScrollView 可以有一个非常大的 documentView 吗?