gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:12 27 4
gpt4 key购买 nike

我有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com