dig*_*lic 5 java arrays size 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;
Run Code Online (Sandbox Code Playgroud)
我希望这可以让你更好地了解我做错了什么.
编辑第二篇:神圣的废话我终于解决了!我将_dataHeap.get(element.index)拉入其自己的变量中.这解决了一切!
正如Bemace所说,检查删除是否按预期工作.我敢打赌,你正在编写的对象上的equals()方法不能按照你期望的方式工作,因为你没有覆盖它.
此外,在重写equals之后,请注意也要覆盖hashCode.当您的对象无法使用HashMaps时,它会为您节省一些问题.:)
提示:查看使用JUnit.它会把这些小错误从水中吹出来,当你的某些东西不能正常工作时,这对你来说很明显.很难忽视你漂亮的绿色酒吧上的鲜红色斑点.
在我看来,您实际上并没有删除任何东西。你remove调用的返回值是多少?
如果您正在使用remove(int)返回值应该是非空的。如果使用remove(Object),结果应该是真的。否则你实际上并没有删除任何东西。尝试删除不存在的元素不是错误,只是返回null或false。