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

彼得·希格斯

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

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

编辑:显然我的问题不清楚,或者我对arraylist.add(object)方法有误解(这也是很有可能的!)。我想要做的是像滑动窗口一样,将对象插入到arraylist的一端,然后将其从另一端放下,当对象插入一端时,其他对象移动一个索引。我可以使用arraylist.add(0,object)从arraylist的左边插入对象,并且每次将前一个对象右移一个索引,但是通过Google搜索,我发现这是非常耗费处理的操作- O(N),如果我没记错的话。因此,我认为“好吧,让我们从arraylist的右端插入对象,没问题!”,假设每次插入仍会将先前的对象移动一个索引(这次是向左移动)。

同样,当我使用术语“索引”时,我只是表示对象在ArrayList中的位置-也许还有一些更正式的术语“索引”,这意味着有所不同。

杰森c

您有两种选择。这是两个基本选项:

  1. 您可以维护一个Map<Object,Integer>与数组并行的索引。当您将元素添加到数组时,可以将其添加到地图中。从开头删除元素时,您将不得不遍历整个地图,并从每个索引中减去一个。

  2. 如果适合您的情况并且Map不满足您的性能要求,则可以将一个index字段添加到对象,并在将索引添加到数组时直接存储该索引。从开头删除元素时,您将必须遍历列表中的所有对象,并从其索引中减去一个。然后,您可以在给定对象的恒定时间内获取索引。

这些在删除后仍然具有更新索引的性能。现在,在选择以下选项之一之后,如果进行了简单的改进,就可以避免删除后在迭代地图/列表时进行更新:

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

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

counter启动程序时的初始值并不重要。)然后找到对象“ x”:

index = x.counter - first object.counter;

是否将其存储counter为新字段还是存储在地图中都取决于您。希望能有所帮助。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用JavaScript在列表中查找对象的首次出现索引的最快/最有效方法是什么?

来自分类Dev

JavaScript在数组中查找对象的最有效方法

来自分类Dev

在具有不同值的对象数组(即数组)中查找对象的最有效方法是什么?

来自分类Dev

有效地查找数组中对象的索引

来自分类Dev

查找间隔索引的有效方法

来自分类Dev

Javascript:在数组中查找对象的索引,不知道索引,仅查找对象

来自分类Dev

查找对象数组的索引

来自分类Dev

在对象数组中查找对象的索引

来自分类Dev

从迭代ArrayList内部删除对象的最有效方法

来自分类Dev

从迭代ArrayList内部删除对象的最有效方法

来自分类Dev

查找键值接近给定值的对象的有效方法

来自分类Dev

在原型Javascript数组中查找对象的索引

来自分类Dev

在原型Javascript数组中查找对象的索引

来自分类Dev

在CoreData的NSOrderedSet中查找对象。索引(ofAccessibilityElement :)

来自分类Dev

在数组数组中按 id 查找对象的索引

来自分类Dev

使用其属性名称在javascript中查找对象的索引

来自分类Dev

如何在 JSON 中查找对象键的索引

来自分类Dev

通过用户输入在ArrayList中查找对象-Java

来自分类Dev

有没有更有效的Java 8 Stream方法可以在int []中查找索引?

来自分类Dev

从Numpy数组的索引中采样的有效方法?

来自分类Dev

在VBA中创建反向索引的有效方法

来自分类Dev

处理ArrayList中图像的最有效方法

来自分类Dev

Python:匹配2个不同长度数组并在较大数组中查找索引的有效方法

来自分类Dev

使用C ++在两个排序数组中查找匹配值索引的最有效方法

来自分类Dev

在两个不同列表中查找相同索引号以比较值的最有效方法

来自分类Dev

在多个联接中查找丢失的行的有效方法

来自分类Dev

在多个联接中查找丢失的行的有效方法

来自分类Dev

在列表中查找对象

来自分类Dev

在列表中查找对象

Related 相关文章

  1. 1

    用JavaScript在列表中查找对象的首次出现索引的最快/最有效方法是什么?

  2. 2

    JavaScript在数组中查找对象的最有效方法

  3. 3

    在具有不同值的对象数组(即数组)中查找对象的最有效方法是什么?

  4. 4

    有效地查找数组中对象的索引

  5. 5

    查找间隔索引的有效方法

  6. 6

    Javascript:在数组中查找对象的索引,不知道索引,仅查找对象

  7. 7

    查找对象数组的索引

  8. 8

    在对象数组中查找对象的索引

  9. 9

    从迭代ArrayList内部删除对象的最有效方法

  10. 10

    从迭代ArrayList内部删除对象的最有效方法

  11. 11

    查找键值接近给定值的对象的有效方法

  12. 12

    在原型Javascript数组中查找对象的索引

  13. 13

    在原型Javascript数组中查找对象的索引

  14. 14

    在CoreData的NSOrderedSet中查找对象。索引(ofAccessibilityElement :)

  15. 15

    在数组数组中按 id 查找对象的索引

  16. 16

    使用其属性名称在javascript中查找对象的索引

  17. 17

    如何在 JSON 中查找对象键的索引

  18. 18

    通过用户输入在ArrayList中查找对象-Java

  19. 19

    有没有更有效的Java 8 Stream方法可以在int []中查找索引?

  20. 20

    从Numpy数组的索引中采样的有效方法?

  21. 21

    在VBA中创建反向索引的有效方法

  22. 22

    处理ArrayList中图像的最有效方法

  23. 23

    Python:匹配2个不同长度数组并在较大数组中查找索引的有效方法

  24. 24

    使用C ++在两个排序数组中查找匹配值索引的最有效方法

  25. 25

    在两个不同列表中查找相同索引号以比较值的最有效方法

  26. 26

    在多个联接中查找丢失的行的有效方法

  27. 27

    在多个联接中查找丢失的行的有效方法

  28. 28

    在列表中查找对象

  29. 29

    在列表中查找对象

热门标签

归档