当前位置: 首页 > 知识库问答 >
问题:

在ArrayList中查找对象索引的有效方法

甄越
2023-03-14

我有一个ArrayList,从ArrayList的末尾(即使用add(object)方法)以串行方式(即逐个)填充Integer类型的对象。每次我这样做,ArrayList中的其他对象都会左移一个索引。

在我的代码中,我想在ArrayList中找到一个随机对象的索引。我想避免使用indexOf方法,因为我有一个非常大的ArrayList,循环将花费大量时间。有什么解决办法吗?如何在某些数据结构中保留ArrayList中对象的索引?

编辑:显然我的问题不清楚,或者我对arraylist有误解。添加(对象)方法(这也是很可能的!)。我想做的是有一个类似滑动窗口的东西,对象插入arraylist的一端,然后从另一端删除,当一个对象插入到一端时,其他对象将移动一个索引。我可以使用arraylist。添加(0,object),从arraylist的左侧插入对象,每次将之前的对象右移一个索引,但在google搜索时,我发现这是一个处理非常密集的操作-如果我记得正确的话,是O(N)。因此,我想“好吧,让我们插入arraylist右端的对象,没问题!”,假设每次插入都会将之前的对象移动一个索引(这次向左)。

此外,当我使用术语“索引”时,我只是指对象在ArrayList中的位置-也许还有一些更正式的术语“索引”,它的意思不同。

共有1个答案

史默
2023-03-14

你有几个选择。以下是两个基本选项:

>

如果它适合您的情况,并且映射不符合您的性能要求,则可以向对象添加索引字段,并在将其添加到数组时直接存储索引。从一开始删除元素时,必须遍历列表中的所有对象,并从其索引中减去一个对象。然后,您可以在给定对象的固定时间内获得索引。

这些仍然有在删除后更新索引的性能影响。现在,在您选择其中一个选项后,如果您进行简单的改进,您可以避免在删除后遍历map/list进行更新:

不要存储每个对象的索引,而是存储到目前为止添加的对象总数的计数。然后要获得实际索引,只需从您要查找的对象的值中减去第一个对象的计数值。例如,当您添加:

add a to end;
a.counter = counter++;
remove first object;

(启动程序时计数器的初始值并不重要。)然后要找到一个对象“x”:

index = x.counter - first object.counter;

您是将计数器存储为新字段还是存储在地图中取决于您。希望有帮助。

顺便说一句当从列表前面删除对象时,链表的性能会更好,但当通过索引访问对象时,性能会更差。这可能更合适,这取决于添加/删除与随机访问之间的平衡(如果您只关心索引,但实际上不需要按索引检索对象,那么随机访问性能并不重要)。如果确实需要进一步优化,可以考虑使用固定容量的环形缓冲区(后插入、前移除和随机访问都是O(1))。

当然,选项3是在更高的层次上重新考虑你的算法;也许有一种方法可以完成你正在寻找的行为,而不需要找到列表中的对象。

 类似资料:
  • 问题内容: 可以说我有一堂课 我将一些数据对象添加到ArrayList中: 为什么indexOf找不到这个?: indexOf是否比我自己遍历整个数组列表更好?还是我错过了一些东西。 问题答案: 该方法 不 经过整个列表。这是Java 7源代码的摘录: 让Java通过它比自己编写它更好。只要确保您的方法足以找到所需的对象即可。您还需要覆盖。 我不会写出您的方法,但是我建议您至少: 检查是否为空 测

  • 我知道这个问题以前可能被问过很多次,但我有一个问题,我找不到一个特别针对我的问题的解决方案。 问题如下: 我有两个火箭和射弹的阵列清单,它们之间的碰撞被检查。当它们碰撞时,两者都被移除。问题是,当arraylist中唯一的火箭被击中时,异常发生了,我不知道如何阻止它发生。 碰撞方法+ArrayLists: 删除和添加方法: 注意:rocket.die()基本上只是删除火箭,与remove方法的方式

  • 我有一个ArrayList,里面有一堆MyObject对象。我想在我的对象中保留一个整数字段,它是ArrayList中这个对象的键,这样我就可以很容易地得到这个元素在ArrayList中的位置。 当我从这个ArrayList中删除一个对象时,会出现问题,因为索引会向左移动。避免这个问题的最佳方法是什么? 我应该不删除元素,而是用null覆盖它们(这样索引就不会移位),还是应该在删除一次之后遍历Ar

  • 我有一个对象数组,当我使用indexOf时,我想在其中找到所选对象的索引,我得到的值为-1,任何人都可以告诉我如何在javascript中找到对象的indexOf

  • 问题内容: 在python中找到对对象的所有引用的好方法是什么? 我问的原因是看起来我们有“内存泄漏”。我们正在将图像文件从Web浏览器上传到服务器。每次执行此操作时,服务器上的内存使用量都会与刚刚上传的文件的大小成比例地增加。python垃圾回收永远不会释放该内存,因此我认为即使在每次请求结束时,也可能存在指向图像数据的流浪引用,这些引用并没有被删除或超出范围。 我认为能够问python很好:“

  • 本文向大家介绍C#查找对象在ArrayList中出现位置的方法,包括了C#查找对象在ArrayList中出现位置的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#查找对象在ArrayList中出现位置的方法。分享给大家供大家参考。具体分析如下: 我们可以通过IndexOf方法来查找对象在ArrayList中的位置 希望本文所述对大家的C#程序设计有所帮助。